//KMP模板
#include<iostream>
#define MaxSize 10
using namespace std;
int Next[MaxSize];
void GetNext(string t,int *Next){
Next[0]=-1;
int i=0,j=-1;//i为当前匹配的位置,j为失配后跳转的位置(最长公共前后缀的长度)
while(i<t.size()-1){//只需循环少一次,因为每次next值由前面的决定
if(j==-1||t[i]==t[j]){
Next[++i]=++j;
/*或者优化写法
i++,j++;
if(t[i]!=t[j]) Next[i]=j;
else Next[i]=Next[j];//nextval*/
}
else j=Next[j];
}
}
int KMP(string s,string t){
int i=0,j=0;
int a=s.size(),b=t.size();//这步很重要!
while(i<a&&j<b){
if(j==-1||s[i]==t[j]){//j=-1表示第一次或者重新开始匹配
i++,j++;
}
else j=Next[j];//匹配失败
}
if(j>=t.size()) return i-b+1;//匹配成功
else return -1;
}
int main()
{
string s,t;
cin>>s>>t;//主串 子串
GetNext(t,Next);
cout<<KMP(s,t);
return 0;
}
05-27
6万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-23
07-23