求调
点击查看代码
#include<bits/stdc++.h>using namespace std;
char a[100001],b[100001];
int n,m;
int next[100001];
void build_next(){next[1]=0;int j=0;for(int i=2;i<=m;i++){while(b[j+1]!=b[i]&&j>0){j=next[j]; }if(b[j+1]==b[i])j++;next[i]=j;}
}
void KMP(){int j=0;for(int i=1;i<=n;i++){while(j>0&&b[j+1]!=a[i]){j=next[j];}if(b[j+1]==a[i])j++;if(j==m)printf("%d\n",i-m+1);j=next[j];}for(int i=1;i<=m;i++){printf("%d ",next[i]);}
}
int main(){cin>>a+1;n=strlen(a+1);cin>>b+1;m=strlen(b+1);build_next();KMP();return 0;
}