P3375 【模板】KMP字符串匹配
//Pro: P3375 【模板】KMP字符串匹配 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int N=1e6+5; char a[N],b[N]; int nxt[N]; int main() { scanf("%s",a+1); scanf("%s",b+1); int la=strlen(a+1),lb=strlen(b+1); for(int i=2,j=0;i<=lb;++i) { while(j&&b[i]!=b[j+1]) j=nxt[j]; if(b[i]==b[j+1]) ++j; nxt[i]=j; } for(int i=1,j=0;i<=la;++i) { while(j&&a[i]!=b[j+1]) j=nxt[j]; if(a[i]==b[j+1]) ++j; if(j==lb) printf("%d\n",i-lb+1); } for(int i=1;i<=lb;++i) printf("%d ",nxt[i]); return 0; }