#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
vector<int> KMP_0(char *str, int n)
{
int len = strlen(str);
int next[len];
next[0]=0;
for(int i=1,k=0;i<len;i++)
{
while(k>0 && str[k]!=str[i])
k=next[k-1];
if(str[k]==str[i])
k++;
next[i]=k;
}
for(int i=0;i<len;i++){
cout<<next[i]<<" ";
}cout<<endl;
vector<int> r(next,next+len);
return r;
}
int kmp(const string& str,const string& pattern,const vector<int>& next){
int i=0;
int j=0;
while(i<str.length()){
if(str[i]==pattern[j]){
if(j==pattern.length()-1){
return i-j;
}
//cout<<i<<"="<<j<<endl;
i++;
j++;
}
else{
while(j>0 && str[i]!=pattern[j])
j=next[j-1];
if(str[i]==pattern[j])
{
i++;
j++;
}else{
i++;
}
}
}
return -1;
}
int main()
{
string str="abcaababcaby";
char pattern[] = "abcaby";
vector<int> next = move(KMP_0(pattern, 6));
cout<<kmp(str,pattern,next);
}