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