z函数即exkmp 对于一个长度为 nn 的字符串 ss,定义函数 z[i]z[i] 表示ss 和s[i,n−1]s[i,n−1] 的的最长公共前缀长度,注意后面算法求z函数时特定 z[0]=0z[0]=0 算法流程:主要核心在求 z[i]z[i] 时要利用前面 z[0],z[1],…,z[i−1]z[0],z[1],…,z[i−1] 的信息,从...
z[1] = n;intl =0,r =0;for(inti =2; i <= n; i++) {if(i <= r) z[i] =min(z[i-l+1],r-i+1);while(i+z[i] <= n && s[i+z[i]] == s[1+z[i]]) z[i]++;if(i+z[i]-1> r) l = i, r = i+z[i]-1; } }voidexkmp(char*s,char*t,intn){intl =0,...
for(int i=1;i<=len;++i) z[i]=0; z[1]=len; for(int i=2,l=0,r=0;i<=len;++i) { if(i<=r) z[i]=min(z[i-l+1],r-i+1); for(;i+z[i]<=len&&s[i+z[i]]==s[z[i]+1];++z[i]); if(i+z[i]-1>r) l=i,r=i+z[i]-1; } } void exkmp(char *s,int ...
#include<iostream>#include<cstdio>#include<ctime>#include<cctype>#include<queue>#include<deque>#include<stack>#include<iostream>#include<iomanip>#include<cstdio>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<cctype>#include<cstdlib>#include<queue>#include<deque>#include<sta...
void exkmp(char *s,int n,char *t,int m) { Z(t,m); for(int i=1;i<=n;++i) p[i]=0; for(int i=1,l=0,r=0;i<=n;++i) { if(i<=r) p[i]=min(z[i-l+1],r-i+1); for(;i+p[i]<=n&&s[i+p[i]]==t[p[i]+1];++p[i]); if...
}inlinevoidexkmp(){getnex();intnow=0,p0=0,ww=min(sl,tl);while(S[now]==T[now]&&now<ww)++now; extend[0]=now;cnt=now+1;vep(1,sl,i) {if(i+nex[i-p0]-1<extend[p0]+p0-1)extend[i]=nex[i-p0];else{intnow=max(0,extend[p0]+p0-i);while(now<tl&&now+i<sl&&T[now]==...
voidexkmp(char*s,intn,char*t,intm){ getZ(t, m, z); for(inti =1, l =0, r =0; i <= n; i++) { if(i <= r) p[i] =min(z[i - l +1], r - i +1); while(i + p[i] <= n && t[p[i] +1] == s[i + p[i]]) ++p[i]; ...