#include <iostream>
using namespace std;
int* com(string b)
{
int len = b.length();
int *pi=new int[len];
pi[0]=0;
int k = 0;
const char* p = b.c_str();
for (int q=1;q<len;q++)
{
while (k>0&&p[k]!=p[q])
{
k=pi[k];
}
if (p[k]==p[q])
{
k++;
}
pi[q]=k;
}
return pi;
}
void kmp(string a,string b)
{
int n = a.length();
int m = b.length();
int *pi=com(b);
for (int j=0;j<m;j++)
{
cout<<pi[j]<<endl;
}
int q=0;
for (int i=0;i<n;i++)
{
while(q>0&&b[q]!=a[i])
{
q=pi[q];
}
if (b[q]==a[i])
{
q++;
}
if (q==m)
{
printf("Pattern occurs with shift %d",i-m);
q=pi[q];
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string a = "bacbababaabcbababaca";
int m = a.length();
string b = "ababaca";
kmp(a,b);
return 0;
}