自用,无讲解
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int lena,lenb,nxt[N];
char a[N],b[N];
int main(){
ios::sync_with_stdio(false);
cin>>(a+1)>>(b+1);
lena=strlen(a+1),lenb=strlen(b+1);
//求出失配数组
for(int i=2,j=0;i<=lenb;i++){
while(j&&b[i]!=b[j+1]) j=nxt[j];
if(b[i]==b[j+1]) j++;
nxt[i]=j;
}
//与文本串匹配
for(int i=1,j=0;i<=lena;i++){
while(j&&a[i]!=b[j+1]) j=nxt[j];
if(a[i]==b[j+1]) j++;
if(j==lenb) cout<<i-j+1<<endl,j=nxt[j];
}
for(int i=1;i<=lenb;i++) cout<<nxt[i]<<" ";
return 0;
}
196

被折叠的 条评论
为什么被折叠?



