洛谷的模板传送门
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; const int N=2000200; int lena,lenb,next[N]; char a[N],b[N]; int main() { scanf("%s%s",a,b); lena=strlen(a); lenb=strlen(b); next[0]=next[1]=0; int k=0; for(int i=1;i<lenb;i++){ while(k&&b[i]!=b[k]) k=next[k]; next[i+1]=b[i]==b[k]?++k:0; } k=0; for(int i=0;i<lena;i++){ while(k&&a[i]!=b[k]) k=next[k]; k+=a[i]==b[k]?1:0; if(k==lenb) printf("%d ",i-lenb+2); } for(int i=1;i<=lenb;i++) printf("%d ",next[i]); return 0; }