跟Manacher类似,都是利用之前的计算结果来省去不必要的计算

感觉能搜到的博客写的都是同样的内容,而且并不是很直观...按照自己的理解写一遍

 

模板:

int nxt[N],ext[N];

void getnxt(char *s,int m)
{
    memset(nxt,0,sizeof(nxt));
    
    nxt[0]=m;
    for(int i=0;i<m-1 && s[i]==s[i+1];i++)
        nxt[1]=i+1;
    
    int l=1;
    for(int i=2;i<m;i++)
    {
        int r=l+nxt[l]-1,j=i+nxt[i-l]-1;
        if(j>=r)
        {
            j=max(0,r-i+1);
            while(i+j<m && s[i+j]==s[j])
                j++;
            nxt[i]=j;
            l=i;
        }
        else
            nxt[i]=nxt[i-l];
    }
}

void getext(char *s,int n,char *t,int m)
{
    memset(ext,0,sizeof(ext));
    getnxt(t,m);
    
    for(int i=0;i<min(n,m) && s[i]==t[i];i++)
        ext[0]=i+1;
    
    int l=0;
    for(int i=1;i<n;i++)
    {
        int r=l+ext[l]-1,j=i+nxt[i-l]-1;
        if(j>=r)
        {
            j=max(0,r-i+1);
            while(i+j<n && j<m && s[i+j]==t[j])
                j++;
            ext[i]=j;
            l=i;
        }
        else
            ext[i]=nxt[i-l];
    }
}
View Code

相关文章: