注意:需要用特殊符号隔开 1 struct ExKmp{
2 void Init(){
3 memset(f,0,sizeof(f));
4 memset(r,0,sizeof(r));
5 }
6
7 void Get_Fail(){
8 f[1]=lent;
9 while(t[2+f[2]]==t[1+f[2]])
10 f[2]+=1;p=2;
11 for(int i=3;i<=lent;i++){
12 int k=p+f[p]-1,L=f[i-p+1];
13 if(i+L-1<k)f[i]=L;
14 else{
15 f[i]=max(0,k-i+1);
16 while(t[1+f[i]]==t[i+f[i]])
17 f[i]+=1;p=i;
18 }
19 }
20 }
21
22 void Exkmp(){
23 Init();Get_Fail();
24 while(s[1+r[1]]==t[1+r[1]])
25 r[1]++;p=1;
26 for(int i=2;i<=lens;i++){
27 int k=p+r[p]-1,L=f[i-p+1];
28 if(i+L-1<k)r[i]=L;
29 else{
30 r[i]=max(0,k-i+1);
31 while(t[1+r[i]]==s[i+r[i]])
32 r[i]+=1;p=i;
33 }
34 }
35 }
36 }kmp;
来源:https://www.cnblogs.com/TenderRun/p/5698385.html