【例题1】Oulipo 一本通
file:///C:/Users/lenovo/AppData/Local/Temp/WeChat%20Files/4d3b911157a7e500ab11bf74b8034dd.png
file:///C:/Users/lenovo/AppData/Local/Temp/WeChat%20Files/13e9db5314a75cf9fba8e661250b682.png
file:///C:/Users/lenovo/AppData/Local/Temp/WeChat%20Files/593b9ac480a1c18eeb3ccfafbfee398.png
以上三张图详细介绍了哈希算法
给出两个字符串s1,s2((只有大写字母),求s1在s2中出现多少次。
例如:s1="ABA",s2="ABAABA",答案为2。
【输入】 输入T组数据,每组数据输出结果。
【输出】 如题述。
【输入样例】 3 BAPC BAPC AZA AZAAZAAZA VEEDI AVERDXIVYERDLAN 【输出样例】 1 3 0 【提示】 1≤s1的长度 ≤104 ,1≤s2的长度 ≤106 。
这道题就是哈希的模板题,求出对应的哈希值,挨个比较就可以
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
int T,b=769,n,m;
ULL powb[1000005]={1},sum[1000005],ans;
char s1[1000005],s2[1000005];
int main(){
for(int i=1;i<=1000005-4;i++){
powb[i]=powb[i-1]*b;
}
scanf("%d",&T);
while(T--){
scanf("%s%s",s1+1,s2+1);//小 大
n=strlen(s1+1);
m=strlen(s2+1);
ULL s=0;
for(int i=1;i<=n;i++){
s=s*b+(s1[i]-'A'+1);
}
for(int i=1;i<=m;i++){
sum[i]=sum[i-1]*b+(s2[i]-'A'+1);
}
ans=0;
for(int k=1;k<=m-n+1;k++){//k+k+n-1
if(s==sum[k+n-1]-sum[k-1]*powb[n])ans++;
}
printf("%d\n",ans);
}
}