kmp算法
#include <iostream>
using namespace std;
const int M = 10010;
const int N = 100010;
char p[M], s[N];
int ne[M];
// http://t.csdn.cn/D1tPp
int main()
{
int m, n;
// kmp算法从 下标1 开始
cin >> m >> (p + 1); // p数组存储被匹配字符串,长度为m,从下标为1处开始存储
cin >> n >> (s + 1); // s数组存储待匹配字符串,长度为n,从下标为1处开始存储
// 求next数组
for (int i = 2, j = 0; i <= m; i++)
{
while (p[j + 1] != p[i] && j)
{
j = ne[j];
}
if (p[j + 1] == p[i])
{
j++;
}
ne[i] = j;
}
for (int i = 1; i <= m; i++)
{
cout << ne[i] << endl;
}
// kmp匹配过程
for (int i = 1, j = 0; i <= n; i++)
{
while (p[j + 1] != s[i] && j)
{
j = ne[j];
}
if (p[j + 1] == s[i])
{
j++;
}
if (j == m)
{
// 匹配成功,题目要求输出下标从0开始时的下标,则(i - m + 1)- 1 进行转化
cout << i - m << endl;
// 更新位置,方便匹配下一处
j = ne[j];
}
}
return 0;
}