AcWing 831. KMP字符串
原题链接
简单
作者:
云_580
,
2024-09-10 14:18:26
,
所有人可见
,
阅读 2
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int n,m;
char par[N],son[N];
int ne[N];
int main(){
//读入字符串,下标从1开始
cin>>n>>son+1>>m>>par+1;
//理解ne[i]=j的含义:字符串的最大公共前后缀长度,即son[1]~son[j] == son[i-j+1]~son[i]
//所以比较的应该是son[i]和son[j+1],其中ne[i-1]已经计算出,当前在计算ne[i]
for(int i = 2,j = 0;i<=n;i++){
while(j&&son[i]!=son[j+1])j=ne[j];
if(son[i]==son[j+1])j++;
ne[i]=j;
}
for(int i = 1,j = 0;i<=m;i++){
while(j&&par[i]!=son[j+1])j=ne[j];
if(par[i]==son[j+1])j++;
if(j==n){
printf("%d ",i-n);
j = ne[j];
}
}
return 0;
}