https://www.luogu.com.cn/problemnew/solution/P3375
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e6+10;
4 int kmp[maxn];
5 char a[maxn],b[maxn];
6 int main()
7 {
8 scanf("%s%s",a+1,b+1);
9 int lena=strlen(a+1);
10 int lenb=strlen(b+1);
11 int index=0;
12 for(int i=2;i<=lenb;i++){
13 while(index&&b[i]!=b[index+1])
14 index=kmp[index];
15 if(b[index+1]==b[i]) index++;
16 kmp[i]=index;
17 }
18 index=0;
19 for(int i=1;i<=lena;i++){
20 while(index>0&&b[index+1]!=a[i])
21 index=kmp[index];
22 if(b[index+1]==a[i])
23 index++;
24 if(index==lenb) {cout<<i-lenb+1<<endl;index=kmp[index];}
25 }
26 for(int i=1;i<=lenb;i++)
27 printf("%d ",kmp[i]);
28 printf("\n");
29 }
来源:https://www.cnblogs.com/pangbi/p/12254801.html