这是一道模板题。
给定一个字符串 A 和一个字符串 B ,求 B在 A 中的出现次数。 A和 B中的字符均为英语大写字母或小写字母。
A中不同位置出现的 B可重叠。
输入格式
输入共两行,分别是字符串 A和字符串 B。
输出格式
输出一个整数,表示 B在 A中的出现次数。
样例输入
zyzyzyz
zyz
样例输出
3
数据范围与提示
1<= A,B的长度<=10^6 ,A、 B仅包含大小写字母。
字符串哈希模板提
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define K 131
#define ULL unsigned long long
int N;
char s1[1000010], s2[1000010];
ULL a[1000010],f[1000010],l1,l2,t;
ULL find(int x,int y) //计算下标 x到 y的子串的哈希值
{
return f[y]-f[x-1]*a[y-x+1];
}
int main()
{
int i,j;
a[0]=1;
for(i=1; i<=1000000; ++i) //先遍历出 a^n
a[i]=a[i-1]*K;
int sum=0;
t=0;
scanf("%s%s",s1+1,s2+1); //从下标 1开始存
l1=strlen(s1+1);
l2=strlen(s2+1);
for(j=1; j<=l1; j++)
f[j]=f[j-1]*K+(s1[j]-'A'+1); //计算主串的滚动哈希值
for(j=1; j<=l2; j++)
t=t*K+(s2[j]-'A'+1); //计算匹配串的哈希值
for(j=1;j+l2-1<=l1; ++j)
{
if(find(j,j+l2-1)==t) //判断两串是否相同
sum++;
}
printf("%d\n",sum);
return 0;
}