int nxt[MAX_N],n,m;
string s,t;//文本串,模式串
int kmp()//模式串在文本串中的个数
{
nxt[0]=-1;//模式串相同前后缀(长度-1)
for(int i=1;i<m;i++)
{
int j=nxt[i-1];
while(j>-1&&t[j+1]!=t[i])//下标存在且不等回溯
j=nxt[j];
if(t[j+1]==t[i])//相等,存储下标
nxt[i]=j+1;
else
nxt[i]=j;
}
int i=0,j=0,ans=0;
while(i<n)
{
if(s[i]==t[j])//相等,同时向前推
{
i++;j++;
if(j==m)
{
ans++;
j=nxt[j-1]+1;
}
}
else
{
if(j==0)//模式串到达起点,文本串前推
i++;
else
j=nxt[j-1]+1;
}
}
return ans;
}
void getnxt()
{
int a=0,p=0;
nxt[0]=m;
for(int i=1;i<m;i++)
{
if(p-i<=0||p-i<=nxt[i-a])
{
p=max(p,i);
while(i<m&&t[p]==t[p-i])
p++;
nxt[i]=p-i;
a=i;
}
else
nxt[i]=nxt[i-a];
}
}
void getextend()
{
int a=0,p=0;
getnxt();
for(int i=0;i<n;i++)
{
if(p-i<=0||p-i<=nxt[i-a])
{
p=max(p,i);
while(p<n&&p-i<m&&s[p]==t[p-i])
p++;
extend[i]=p-i;
a=i;
}
else
extend[i]=nxt[i-a];
}
}