kmp模板,自己整理,仅做模板保存
#include<bits/stdc++.h>
using namespace std;
char tt[200],ss[200];//tt为模式串,下标从0开始,ss为匹配串
int net[200];
void getnet(int len)
{
net[0]=-1;
int k=-1;
for(int q=1;q<=len-1;q++)
{
while(k>-1&&tt[k+1]!=tt[q]) k=net[k];
if(tt[k+1]==tt[q]) k+=1;
net[q]=k;
}
// a b b c a a b b c
// -1 -1 -1 -1 0 0 1 2 3 net数组存储的是此位最长前缀后缀减一
}
void kmp(int lens,int lent)
{
int k=-1;
for(int i=0;i<lens;i++)
{
while(k>-1&&tt[k+1]!=ss[i]) k=net[k];
if(tt[k+1]==ss[i]) k+=1;
if(k==lent-1)
{
cout<<i-lent+1<<endl;
k=net[k]; //可重叠,寻找下一个
//k=-1;//不可重叠,找下一个
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>ss;
cin>>tt;
int len=strlen(tt);
getnet(len);
int lens=strlen(ss);
kmp(lens,len);
return 0;
}