跟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]; } }