#include <string.h>
#include <iostream>
void getNext(char* p,int next[])
{
int i = 0;
int k = -1;
next[0] = -1;
int pLen = strlen(p);
while(i < pLen - 1) {
if(k == -1 || p[i] == p[k]) {
i++;
k++;
next[i] = k;
} else {
k = next[k];
}
}
}
int kmp(char* s,char*p)
{
int i = 0;
int j = 0;
int sLen = strlen(s);
int pLen = strlen(p);
int next[pLen];
getNext(p,next);
while( i < sLen && j < pLen) {
if( j == -1 || s[i] == p[j]) {
i++;
j++;
} else {
j = next[j];
}
}
if( j == pLen) return i - j;
else return -1;
}
int main(int argc,char** argv)
{
char s[] = "bacbababadababacambabacaddababacasdsd";
char p[] = "ababaca";
std::cout << "source string is " << s << std::endl;
std::cout << "pattern string is " << p << std::endl;
std::cout << kmp(s,p) << std::endl;
}