AcWing 831. KMP字符串
原题链接
简单
作者:
松鼠爱葡萄
,
2020-08-24 09:30:16
,
所有人可见
,
阅读 566
#include<iostream>
using namespace std;
const int N=1e5+10, M=1e6+10;
int n,m; //短串长度(匹配串),长串长度(模式串)
char p[N], s[M];
int ne[N]; //ne数组
//ne[i]=j
//含义是 p[1,j]==p[i-j+1,i] 以1为开始长度为j的字符串 等于 以i为结尾长度为j的字符串
//也就是说,当s[i]!=p[j+1]时, p字符串要进行回退,回退到ne[j]
//如果是暴力算法, 当发生不匹配情况时,p字符串就回退到起始点
int main(){
cin>>n>>p+1>>m>>s+1;
//模板串p与自身进行匹配,发现相等的前缀和后缀,从而计算出ne数组
//ne[1]=0, 所以i从2开始
for(int i=2,j=0;i<=n;i++){
while(j && p[i]!=p[j+1]) j=ne[j];
if(p[i]==p[j+1]) j++;
ne[i]=j;
}
//模板串p 与长串s进行匹配
//输出数据是要求从0开始计数
for(int i=1,j=0;i<=m;i++){
while(j && s[i]!=p[j+1]) j=ne[j];
if(s[i]==p[j+1]) j++;
if(j==n){
printf("%d ", i-n);
j=ne[j];
}
}
}