洛谷 P3375 【模板】KMP字符串匹配
KMP 模板
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1000005
using namespace std;
char s1[MAXN],s2[MAXN];
int nxt[MAXN];
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
scanf(" %s %s ",s1,s2);
nxt[0]=-1;
int j=-1,i=0;
int n=strlen(s1),m=strlen(s2);
while(i<m){
while(j!=-1&&s2[i]!=s2[j])j=nxt[j];
nxt[++i]=++j;
}
i=j=0;
while(i<n){
while(j!=-1&&s1[i]!=s2[j])j=nxt[j];
i++;j++;
if(j>=m){
printf("%d\n",i-m+1);
j=nxt[j];
}
}
for(int i=1;i<=m;i++)printf("%d ",nxt[i]);
return 0;
}