1 void doit(){
2 //字符串采用快速读入 从1开始
3 pre=0;
4 Next[0]=0;Next[1]=0;//起点标记
5 FOR(suf,2,lenx){
6 while(pre>0&&x[suf]!=x[pre+1]) pre=Next[pre]; //递推求最大公共前后缀
7 //Next[suf]=以suf为末尾的后缀的【最大公共前后缀】对应的前缀末尾位置
8 //0 表示不存在
9 if(x[suf]==x[pre+1]) pre++;
10 Next[suf]=pre;
11 }
12 return;
13 }
14 void kmp(){
15 int ans=0;
16 int pre=0;//匹配指针
17 FOR(suf,1,lens){
18 while(pre>0&&s[suf]!=x[pre+1]) pre=Next[pre]; //匹配指针前滚复位
19 if(s[suf]==x[pre+1]) pre++; //fix
20 if(pre==lenx) pre=Next[pre],ans++;//匹配成功,复位(作失配处理);
21 }
22 return;
23 }