#include <stdlib.h>
#include <stdio.h>
#include <string>
using namespace std;
int * cover(string &pattern)
{
/*pattern = "abcdab"*/
int size = pattern.size();
int *p = new int[size];
int length = 0,r = size;
string str1;
if (!p)
{
printf("new error\n");
exit(1);
}
for (int i = 1;i < size+1; i++)
{
str1 = pattern.substr(0, i);
length = i - 1;
r = 1;
while (str1.substr(0,length) != str1.substr(r, length))
{
length--;
r++;
}
p[i - 1] = length;
}
return p;
}
int kmp(string &str, string &pattern)
{
int r = -1, i = 0;
unsigned int pos;
int *p = cover(pattern);
int length = str.size() - pattern.size();
for (int m = 0; m < pattern.size(); m++)
{
printf("pattern[%d] = %4d\n", m, p[m]);
}
for (i; i < length; i++)
{
pos = 0;
while(pos < pattern.size())
{
if (str[i+pos] == pattern[pos])
{
pos++;
}
else
{
i += p[pos - 1];
break;
}
}
if (pos == (pattern.size() - 1))
{
delete[] p;
return r = i;
}
}
delete[] p;
return r;
}
int main()
{
string str = "abcabcabdfg";
string pattern = "abcabd";
int pos = kmp(str, pattern);
printf("%d\n", pos);
return 0;
}