KMP之所以线性,因为匹配的时候i是不往回走的
我们只用调整j的位置
假设在s中找t
用二元组(i,j)表示s串的[i-j+1,i] 与t串的[1,j]匹配
假设s[i+1]和t[j]匹配上了,就j++
如果不匹配的话,我们就想办法调整j,
直到找到一个满足二元组条件的j并且t[j+1]=s[i]
快速调整j就是利用nxt数组的过程,
处理nxt的方法类似与两个串之间的匹配
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000010
using namespace std;
char s[N],t[N];
int T,nxt[N],n,m,ans;
int main()
{
scanf("%d",&T);
getchar();
while (T--)
{
ans=;
memset(nxt,,sizeof(nxt));
scanf("%s%s",s+,t+);
n=strlen(s+),m=strlen(t+);
for (int i=,j=;i<=n;i++)
{
while (j> && s[j+]!=s[i]) j=nxt[j];
if (s[j+]==s[i]) j++;
nxt[i]=j;
}
for (int i=,j=;i<=m;i++)
{
while (j> && s[j+]!=t[i]) j=nxt[j];
if (s[j+]==t[i]) j++;
if (j==n) ans++,j=nxt[j];
}
printf("%d\n",ans);
}
return ;
}