扩展KMP模板
注意:需要用特殊符号隔开
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;
尽最大的努力,做最好的自己!