题目大意:
给你两个字符串,A,B,问A串中有多少个子串是B串。
解题方法:
简单的字符串hash,不多解释了。
我的代码:
#include <cstdio>
#include <string>
#include <iostream>
#include <cstring>
#define hash_t unsigned long long
using namespace std;
hash_t BKDRHash(char *str)
{
hash_t seed = 131; // 31 131 1313 13131 131313 etc..
hash_t hash = 0;
while (*str){
hash = hash * seed + (*str++);
}
return hash;
}
hash_t acb(hash_t a,hash_t b){
hash_t ans=1;
for (int i=1;i<=b;i++)
ans*=a;
return ans;
}
int getans(char *s1,char *s2){
int ans=0;
hash_t seed = 131;
hash_t hash1=BKDRHash(s1);
hash_t hash2=0;
int n1,n2;
n1=strlen(s1);n2=strlen(s2);
//cout<<hash1<<endl;
hash_t PPP=acb(seed,n1-1);
for (int i=0;i<n2;i++){
if (i>=n1){
hash2=hash2-(hash_t)s2[i-n1]*PPP;
hash2=hash2*seed+s2[i];
//cout<<hash2<<endl;
}
else {
hash2=hash2*seed+s2[i];
}
if (hash2==hash1) ans++;
}
return ans;
}
int n;
char s1[1000010],s2[1000010];
int main (){
//freopen("test.in","r",stdin);
scanf("%d",&n);
while (n--){
scanf("%s",s1);
scanf("%s",s2);
printf("%d\n",getans(s1,s2));
}
return 0;
}