KMP板子【搬运】
void getnext()
{
int j=0;k=-1;
next[0]=-1;
while(j<tlen)
if(k==-1||T[j]==T[k])next[++j]=++k;
else k=next[k];
}
int kmp_index()
{
int i=0,j=0;
getnext()
while(i<slen&&j<tlen)
{
if(j==-1||S[i]==T[j])i++,j++;
else j=next[j];
}
if(j==tlen)return i-tlen;
else return -1;
}
int kmp_count()
{
int ans=0,j=0;
if(slen==1&&tlen==1)
{
if(S[0]==T[0])return 1;
return 0;
}
getnext();
for(int i=0;i<lens;i++)
{
while(j>0&&T[j]==S[i])j=next[j];
if(S[i]==T[j])j++;
if(j==tlen)
{
ans++;
j=next[j];
}
}
return ans;
}