提交时间:2022-02-28 12:59:35

运行 ID: 46185

#include<bits/stdc++.h> using namespace std; const int M=1000010; char s[M],t[M]; int n,m,Next[M]; void GetNext(){ Next[1]=0; for(int i=2,j=0;i<=n;++i) { for(;j>0 && t[i]!=t[j+1];j=Next[j]); if(t[i]==t[j+1]) ++j; Next[i]=j; } return ; } void KMP(){ for(int i=1,j=0;i<=n;++i) { for(;j>0 && s[i]!=t[j+1];j=Next[j]); if(s[i]==t[j+1]) ++j; if(j==m) cout<<i-j+1<<'\n'; } return ; } int main(){ cin>>s+1>>t+1; n=strlen(s+1),m=strlen(t+1); GetNext(),KMP(); for(int i=1;i<m;++i) cout<<Next[i]<<' '; cout<<Next[m]<<'\n'; return 0; }