POJ 3461Oulipo KMP模板

时间:2022-08-16 05:12:22

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 ;
}