a是主串,b是要找的串
const int N=1e5+10;
char a[N];
char b[N];
int Next[N];
void find_Next()
{
Next[0]=0;
int len=strlen(b),k=0;
rep(i,1,len)
{
while(k&&b[k]!=b[i])
k=Next[k-1];
if(b[k]==b[i]) k++;
Next[i]=k;
}
}
int KMP()
{
find_Next();
int ans=0,lena=strlen(a),lenb=strlen(b);
for(int i=0,j=0;i<lena;i++)
{
while(a[i]!=b[j]&&j)
j=Next[j-1];
if(a[i]==b[j]) j++;
if(j==lenb)
{
return i-j+1;
}
}
return -1;
}