// http://www.cnblogs.com/c-cloud/p/3224788.html
#include <iostream>
#include <cstring>
using namespace std;
void makeNext(const char* dest, int next[])
{
int m =strlen(dest);
int p,k;
next[0]=0;
for(p=1,k=0; p<m; p++)
{
while(k>0 && dest[p] != dest[k])
{
k= next[k-1];
}
if(dest[p]==dest[k])
{
k++;
}
next[p]=k;
}
}
int MyKMP(const char* dest, const char* src, int next[])
{//从第一位开始计数
makeNext(src, next);
int lenSrc=strlen(src);
int lenDest = strlen(dest);
for(int i=0, q=0; i<lenDest;i++)
{
while(q>0 && src[i]!=dest[q])
{
q=next[q-1];
}
if(src[i]==dest[q])
{
q++;
}
if(lenSrc == q)
{
cout<<"the position is:"<<(i-lenSrc+1)<<endl;
}
}
}
int stupidKMP(const char *dest, const char* src)
{ //从第零位开始计数
int i=0;
int j=0;
while(dest[i+j]&&src[j])
{
if(dest[i+j]==src[j])
{
j++;
}
else
{
i++;
j=0;
}
}
if(src[j]==' ')
{
return i;
}
else
{
return -1;
}
}
int main()
{
int i;
char dest[] = "BBC ABCDAB ABCDABCDABDE";
char src[] = "ABCDABD";
int size = strlen(src);
int next[15]={0};
cout<<dest<<endl;
cout<<src<<endl;
cout<<stupidKMP(dest,src)+1<<endl; //stupid KMP
MyKMP(dest,src,next); //KMP
for (i = 0; i < strlen(src); ++i)
{
cout<<next[i];
}
cout<<endl;
return 0;
}