kmp
#include<bits/stdc++.h> using namespace std; #define maxn 5000000 char a1[maxn],a2[maxn];int f[maxn]; void find(char* t,char* p,int *f) { int n=strlen(t),m=strlen(p); int j=0; for (int i=0;i<n;i++) { while (j&&p[j]!=t[i]) j=f[j]; if (p[j]==t[i]) j++; if (j==m) printf("%d\n",i-m+2); //cout<<i-m+2<<endl; } }; void getfail(char *p,int *f) { int m=strlen(p); f[0]=0;f[1]=0; for (int i=1;i<m;i++) { int j=f[i]; while (j && p[i]!=p[j]) j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; } }; int main() { //std::ios::sync_with_stdio(false); freopen("noip.in","r",stdin); freopen("noip.out","w",stdout); //cin>>a1>>a2; scanf("%s",a1); scanf("%s",a2); int l=strlen(a2); getfail(a2,f); find(a1,a2,f); for (int i=1;i<=l;i++) printf("%d ",f[i]); //cout<<f[i]<<" "; return(0); }