扩展KMP模板

微笑、不失礼 提交于 2020-01-12 17:07:53
注意:需要用特殊符号隔开 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;

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!