本子君

ekmp模板

模板,自己用

ll enext[maxn],extend[maxn];
char s[maxn],t[maxn];

void getnext(char *t)
{
    int len=strlen(t),a=0;
    enext[0]=len;
    while(a<len-1 && t[a]==t[a+1]) a++;
    enext[1]=a;
    a=1;
    for(int k=2;k<len;k++)
    {
        int p=a+enext[a]-1,L=enext[k-a];
        if((k-1)+L>=p)
        {
            int j=(p-k+1)>0 ? (p-k+1) : 0;
            while(k+j<len && t[k+j]==t[j]) j++;
            enext[k]=j;
            a=k;
        }
        else
            enext[k]=L;
    }
}

void getextend(char *s,char *t)
{
    int slen=strlen(s),tlen=strlen(t),a=0;
    getnext(t);
    int MinLen = slen < tlen ? slen : tlen;
    while(a<MinLen && s[a]==t[a]) a++;
    extend[0]=a;
    a=0;
    for(int k=1;k<slen;k++)
    {
        int p=a+extend[a]-1, L=enext[k-a];
        if((k-1)+L>=p)
        {
            int j=(p-k+1)>0 ? (p-k+1) : 0;
            while(k+j<slen && j<tlen && s[k+j]==t[j]) j++;
            extend[k]=j;
            a=k;
        }
        else
            extend[k]=L;
    }
}

 

posted on 2019-07-28 23:45  本子君  阅读(251)  评论(0编辑  收藏  举报

导航