#include <iostream>
using namespace std;
int* buildNext(char * p)
{
size_t m = strlen(p), j = 0;
int *Next = new int[m];
int t = Next[0] = -1;//模式串指针
while (j<m - 1) {
if (t<0 || p[j] == p[t]) {
Next[++j] = ++t;
}
else{
t = Next[t];
}
}
return Next;
}
int KMP(char* p, char *T)
{
int *next = buildNext(p);//构造next表
int n = (int)strlen(T), i = 0;//文本串指针
int m = (int)strlen(p), j = 0;//模式串指针
while (i<n&&j<m)
{
if (j<0 || T[i] == p[j]) {
i++; j++;
}
else{
j = next[j];
}
}
delete[] next;
return i - j;
}
int main(int argc, const char * argv[]) {
cout<<KMP("abcdefg","cde");
return 0;
}