KMP
来源:互联网 发布:软件学校网上报名 编辑:程序博客网 时间:2024/06/07 04:10
/* kmp luogu p3375 by sbn 2017-12-24*/#include<iostream>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>using namespace std;string s1,s2;int nt1[1000001],nt2[1000001];void calnt1(){ //s1的next计算 nt1[0]=-1; int k=-1; for (int i=1;i<s1.size();i++){ while (k>-1&&s1[k+1]!=s1[i]) k=nt1[k]; if (s1[k+1]==s1[i]) k++; nt1[i]=k; }}void calnt2(){ //s2的next计算 nt2[0]=-1; int k=-1; for (int i=1;i<s2.size();i++){ while (k>-1&&s2[k+1]!=s2[i]) k=nt2[k]; if (s2[k+1]==s2[i]) k++; nt2[i]=k; }}void KMP(){ calnt1(); calnt2(); int k=-1; for (int i=0;i<s1.size();i++){ while (k>-1&&s2[k+1]!=s1[i]) k=nt2[k]; if (s2[k+1]==s1[i]) k++; if (k==s2.size()-1){ cout<<i-s2.size()+2<<endl; k=-1; i=i-s2.size()+1; } }}int main(){ cin>>s1>>s2; KMP(); for (int i=0;i<s2.size();i++) cout<<nt2[i]+1<<" ";}
阅读全文