int * CreateNextArray(char *str2,int nlen2)
{
int * next=(int *)malloc(sizeof(int)*nlen2);
next[0]=-1;
if(nlen2==1)
{
return next;
}
next[1]=0;
int i=2;
int cn=0;
while(i<nlen2)
{
if(str2[i-1] == str2[cn])
{
next[i++]=++cn;
}
else if(cn>0)
{
cn=next[cn];
}
else
{
next[i++]=0;
}
}
return next;
}
int KMP(char *str1,int nlen1,char *str2,int nlen2)
{
if(nlen2>nlen1 || nlen1<=0 || nlen2 <=0) return -1;
int *next=CreateNextArray(str2,nlen2);
// for(int i=0;i<nlen2;i++)
// {
// cout<<next[i]<<" ";
// }
cout<<endl;
int i=0;
int j=0;
while(i<nlen1 && j<nlen2)
{
if(str1[i] == str2[j])
{
i++;
j++;
}
else if(next[j]<0)
{
i++;
}
else
{
j=next[j];
}
}
// cout<<i <<" "<<j<<endl;
return j==nlen2 ? i-j:-1;
}