kmp模板
//next存下的值是当前区间最大前缀与后缀重合的值。
#include<iostream>
using namespace std;
const int N = 100010,M = 1000010;
int n,m;
char p[N],s[M];
int ne[N];
int main(){
//两个字符数组从下标1开始读入
cin >> n >> p + 1 >> m >> s + 1;
//赋值ne数组
for(int i = 2,j = 0;i <= n; i ++){
//不匹配或j == 0时将j推向next值,j == 0说明需要从头开始匹配
while(j && p[i] != p[j + 1]) j = ne[j];
//匹配成功,指针后移一位
if(p[i] == p[j + 1]) j ++;
//赋值
ne[i] = j;
}
//kmp匹配
for(int i = 1,j = 0;i <= m;i ++){
//不匹配或j == 0时将j推向next值,j == 0说明需要从头开始匹配
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];
}
}
return 0;
}
KMP的意义
1.KMP的ne数组的赋值就是查找自身上一个重合的子串
2.ne数组的使用就是检查下一个出现最多字符的子串