题目
题目描述
给出两个串
S
1
,
S
2
S1,S2
S1,S2,(只有大写字母),求
S
1
S1
S1在
S
2
S2
S2中出现了多少次
输入T组数据,对每组数据输出结果
样例
输入
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN
输出
1
3
0
思路
Hash模板,证明略
代码
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int M=1e6+7;
ull power[M];//power[i]表示b的i次方
ull b=101;
ull sum[M];
char s1[M],s2[M];
int main()
{
power[0]=1;
for(int i=1;i<10000;i++){
power[i]=power[i-1]*b;
}
int T;
cin>>T;
while(T--){
scanf("%s%s",s1+1,s2+1);
int l1=strlen(s1+1),l2=strlen(s2+1);
sum[0]=0;
for(int i=1;i<=l2;i++){
sum[i]=sum[i-1]*b+s2[i]-'A'+1;//主串的哈希值
}
ull s=0;
for(int i=1;i<=l1;i++){//匹配串的哈希值
s=s*b+s1[i]-'A'+1;
}
int ans=0;
for(int i=0;i<=l2-l1;i++){//枚举起点为i,长度为n的子串,批判于匹配串是否匹配
if(s==sum[i+l1]-sum[i]*power[l1]){
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}