通过学习y总的视频中kmp介绍,将KMP模板记录一下,现在理解还不是很透彻,供自己以后复习的时候进行学习查看。
#include<iostream>
using namespace std;
const int N = 100010, M = 1000010;
// p是模板串, s是模式串
char p[N], s[M];
// ne是next数组 记录了下一个和当前串匹配的串在模板串中的下标
// ne[j] = k 表示 p[1, k] 和 p[j-k, j] 串是匹配的
int ne[N];
int n, m;
int main(){
cin >> n >> p+1 >> m >> s+1;
// ne数组的初始化
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;
}// end for
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){
cout<<i-n<<" ";
j = ne[j]; // 重新开始匹配
}
}// end for
}