void getnext(const string& str,vector<int>&next)
{
if(str.empty())
return ;
next[0]=-1;
int len=str.length();
int k=-1;
int j=0;
while(j<len-1)
{
if(j==0||str[j]==str[k])
{
next[++j]=++k;
}
else
k=next[k];
}
}
int KMP(const string& str,const string& key)
{
int len1=str.length();
int len2=key.length();
if(len1==0||len2==0||len1<len2)
return -1;
int j=0;int i=0;
while(i<len1&&j<len2)
{
if(j==-1||str[i]==str[j])
++i,++j;
else
j=next[j];
}
if(j==len2)
return i-len2;
else
return -1;
}