题目:P3375 【模板】KMP字符串匹配
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int next[1000000];
int i,j,la,lb;
string a,b;
void getnext()
{
int l,j=-1,k=0;
next[0]=-1;
while (k<lb)
{
if (j<0 || b[k]==b[j])
{
j++;k++;
next[k]=j;
}
else
j=next[j];
}
}
int main()
{
int x=-1,y=-1;
cin>>a>>b;
la=a.size(); lb=b.size();
getnext();
int j=0,k=0;
while (k<la)
{
if ((j<0 || a[k]==b[j])&&j!=lb)
{
j++;k++;
if (j==lb) cout<<k-lb+1<<endl;
}
else
j=next[j];
}
for (i=1;i<=lb;i++)
printf("%d ",next[i]);
printf("\n");
}