求模式串在待匹配串的出现次数。Input
第一行是一个数字T,表明测试数据组数。 之后每组数据都有两行:第一行为模式串,长度不大于10000;第二行为待匹配串,长度不大于1000000。所有字符串只由大写字母组成。Output
每组数据输出一行结果。Sample Input
4 ABCD ABCD ABA ABABABA CDCDCDC CDC KMP NAIVESample Output
1 3 0 0
这也是一道hash的算法题, 下面给出AC代码:
#include<stdio.h>
#include<string.h>
#define ull unsigned long long
char ch1[1000009];
ull hash[1000009];
char ch2[10009];
const int p=300;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(hash,0,sizeof(hash));
ull hp=1,hp1=0,hp2=0;
scanf("%s %s",ch2,ch1);
int l2=strlen(ch2);
int l1=strlen(ch1);
for(int i=0;i<l2;i++)
hp*=p;
for(int i=0;i<l2;i++)
hp1=hp1*p+ch2[i];
hash[0]=ch1[0];
for(int i=1;i<l1;i++)
hash[i]=hash[i-1]*p+ch1[i];
int cnt=0;
if(hash[l2-1]==hp1) cnt++;
for(int i=l2;i<l1;i++)
{
ull m=hash[i]-hash[i-l2]*hp;
if(m==hp1) cnt++;
}
printf("%d\n",cnt);
}
return 0;
}