题意
给你字符A,B问你B中的A有几个
思路
字符串hash,将A的hash值求出,遍历B的每个点判断hash值是否与A相等
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
const int seed=13331;
const int MAXN=1e6+10;
char str1[MAXN],str2[MAXN];
ull xp[MAXN],hash_1[MAXN],hash_2[MAXN];
void init()
{
xp[0]=1;
for(int i=1;i<MAXN;i++) xp[i]=xp[i-1]*seed;
}
ull get_hash(int i,int L,ull hash[])
{
return hash[i]-hash[i+L]*xp[L];
}
void make_hash(char str[],ull hash[])
{
int len=strlen(str);
hash[len]=0;
for(int i=len-1;i>=0;i--)
hash[i]=hash[i+1]*seed+str[i]-'a'+1;
}
int main()
{
init();
int T;cin>>T;
while(T--)
{
scanf("%s%s",str1,str2);
make_hash(str1,hash_1);
make_hash(str2,hash_2);
int len1=strlen(str1);
int len2=strlen(str2);
ull ans1=get_hash(0,len1,hash_1);
int cont=0;
for(int i=0;i<len2;i++)
{
if(i+len1>len2) break;
ull ans2=get_hash(i,len1,hash_2);
if(ans2==ans1) cont++;
}
printf("%d\n",cont);
}
return 0;
}