#include<stdio.h>
#include<iostream>
using namespace std;
bool KMP_Next(const char *P, int *Next, int size)
{
int lenP = strlen(P);
if(size < lenP)
return false;
int i = 0, j = -1;
Next[0] = -1;
while(i < lenP)
{
if(j == -1 || P[i] == P[j])
{
++j;
++i;
Next[i] = j;
}
else
{
j = Next[j];
}
}
return true;
}
void print(int *Next, int size)
{
for(int i = 0; i != size; ++i)
{
cout << Next[i] << endl;
}
}
int KMP(const char *P, const char *S, int pos)
{
int lenP = strlen(P);
int lenS = strlen(S);
if(lenP >= lenS || pos < 1)
return 0;
int i = pos - 1, j = 0;
int *Next = new int[lenP];
if(!KMP_Next(P, Next, lenP))
return 0;
print(Next, lenP);
while(i < lenS && j < lenP)
{
if(j == -1 || S[i] == P[j])
{
++i;
++j;
}
else
{
j = Next[j];
}
}
if(j < lenP)
return 0;
else
return i - j + 1;
}
int main(int argc, char *argv[])
{
cout << KMP("bc", "abcdefa", 3) <<endl;
system("pause");
return 0;
}