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(a1 && t[a]==t[a+1]) a++;
    enext[1]=a;
    a=1;
    for(int k=2;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;
            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;
    extend[0]=a;
    a=0;
    for(int k=1;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;
            extend[k]=j;
            a=k;
        }
        else
            extend[k]=L;
    }
}

 

你可能感兴趣的:(ekmp模板)