#include<bits/stdc++.h> using namespace std; int n,m,ne[1001010]; string s1,s2; int main(){ cin>>s1>>s2; n=s1.size(); m=s2.size(); s1='s'+s1; s2='s'+s2; int j=0; ne[1]=0; for(int i=2;i<=m;){ if(s2[i]==s2[j+1]){ ne[i]=ne[i-1]+1; i++; j++; continue; } if(j==0){ ne[i]=0; i++; continue; } j=ne[j]; } int now=0; for(int i=1;i<=1+n;){ if(now==m){ cout<<i-m<<'\n'; now=ne[now]+1; i++; continue; } if(s2[now+1]==s1[i]){ now++; i++; continue; } if(now==0){ i++; continue; } now=ne[now]; } for(int i=1;i<=m;i++){ cout<<ne[i]<<' '; } return 0; }
Note.ms
/kmp