题目描述:
这是一道模板题。
给定一个字符串 A 和一个字符串 B,求 B 在 A 中的出现次数。A 和 B 中的字符均为英语大写字母或小写字母。
A中不同位置出现的 B 可重叠。
输入格式:
输入共两行,分别是字符串 A 和字符串 B。
输出格式:
输出一个整数,表示 B 在 A 中的出现次数。
1zyzyzyz
2zyz
样例输入:
样例输出:
3
数据范围与提示:
1<=A,B的长度<=10^6,A,B仅包含大小写字母
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
int b=11,ans;
ULL Hash[10000000],Pow[10000001],s;//Pow[i]表示b的i次幂
int main()
{
char s1[10000002],s2[10000003];
Pow[0]=1;
for(int i=1;i<=10000000;i++)//预处理b的n次幂
Pow[i]=Pow[i-1]*b;
scanf("%s%s",s1+1,s2+1);
int l1=strlen(s1+1),l2=strlen(s2+1);
Hash[0]=0,s=0,ans=0;
for(int i=1;i<=l1;i++)
Hash[i]=Hash[i-1]*b+(ULL)(s1[i]-'A'+1);//算主串哈希值
for(int i=1;i<=l2;i++)
s=s*b+(ULL)(s2[i]-'A'+1);//算匹配串的哈希值
for(int i=0;i<=l1-l2;i++)
if(s==Hash[i+l2]-Hash[i]*Pow[l2]) ans++;
cout<<ans;
return 0;
}