KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!
KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索
模板代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int Next[maxn], n1, n2;
string str, mo;
void GetNext()
{
int i = 0, j = -1;
while(i < n2)
{
if(j == -1 || mo[i] == mo[j])
{
i++; j++;
Next[i] = j;
}
else j = Next[j];
}
return;
}
int kmp()
{
int cnt = 0;
int i = 0, j = 0;
while(i < n1)
{
if (j == -1 || str[i] == mo[j])
{
i++; j++;
}
else j = Next[j];
if(j == n2)
{
cnt++;//计算次数
cout<<i-n2+1<<endl;//返回位置
j=Next[j];
}
}
cout<<cnt;
}
int main() {
cin >> str >> mo;
n1 = str.length();
n2 = mo.length();
Next[0] = -1;
GetNext();
kmp();
return 0;
}