KMP
资料:
小蓝P297-299
大黑P588-593
徐鸿图讲稿网址:
https://blog.xehoth.cc/2016/11/08/KMP算法学习总结/#KMP算法学习总结
重点内容:
1.next数组性质
2.思路:
·next[1]=0
·u a u q u a u a a
0 0 1 0 1 2 3 2 0
##P934:字符串匹配KMP模板题 ##
#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<ctime>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
char s1[1000010],s2[1000010];
int next[1000010];
int cnt,yes=1,t,lens1,lens2;
inline void kmp(){
for (int i=2;i<=lens2;i++){
while(t!=0 && s2[i]!=s2[t+1])
t=next[t];
if (s2[i]==s2[t+1])
t++;
next[i]=t;
}
}
int main(){
scanf("%s%s",s1+1,s2+1);
lens1=strlen(s1+1);
lens2=strlen(s2+1);
kmp();
for (int i=1;i<=lens1;i++){
while(cnt!=0 && s1[i]!=s2[cnt+1])
cnt=next[cnt];
if (s1[i]==s2[cnt+1])
cnt++;
if (cnt==lens2){
cout<<i-cnt+1<<endl;
yes=0;
}
}
if(yes==1)
cout<<"NO"<<endl;
return 0;
}