题意: 求模式串在文本串中出现的次数;
分析: 数据比较大, 普通的查找超时, 因此要用KMP算法, 但是KMP算法只能求首次出现的位置, 因此当每次匹配到模式串最后一个的时候把它当作失配来处理, 但是计数器要加一;
#include<stdio.h>
#include<string.h>
char a[1000010],b[10010];
int Next[10010],T;
int main()
{
for(scanf("%d",&T);T--;)
{
scanf("%s%s",b,a);
int m=strlen(b),n=strlen(a);
Next[0]=-1;
int k=-1,j=0;
while(j<m-1)
{
if(k==-1 || b[j]==b[k]) Next[++j]=++k;
else k=Next[k];
}
int i=0,cnt=0;
j=0;
while(i<n && j<m)
{
if(j==-1 || a[i]==b[j])
{
if(j==m-1) cnt++,j=Next[j];
else i++,j++;
}
else j=Next[j];
}
printf("%d\n",cnt);
}
return 0;
}