题意:给定文本串 a 和 模式串 b ,求 b 在 a 中出现过多少次。
分析:KMP裸题,稍微改动一下就可以 了
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 1E6+10;
const int M = 1E4+10;
char a[N],b[M];
int nxt[M];
int n,m;
void GetNext()
{
nxt[0]=-1;
int k=-1;
int j=0;
while(j<m-1)
{
if(k==-1||b[j]==b[k])
{
++j;
++k;
nxt[j]=k;
}
else
{
k=nxt[k];
}
}
}
void kmp()
{
int i=0;
int j=0;
int tot=0;
while(i<n)
{
if(j==-1||a[i]==b[j])
{
i++;j++;
}
else
{
j=nxt[j];
}
if(j==m)
{
i--;j--;
tot++;
j=nxt[j];
}
}
printf("%d\n",tot);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",b,a);
n=strlen(a);
m=strlen(b);
GetNext();
kmp();
}
return 0;
}