<span style="font-size:18px;"><strong>转自http://blog.csdn.net/huangkuizuiniu/article/details/50619698</strong></span>
#include<iostream>
#include<cstdio>
#include<cstring>
#define ull unsigned long long
using namespace std;
const ull B=1e8+5,C=1e8+7;
const int maxn=100001;
char a[maxn],b[maxn*100];
int ans;
int al,bl;
int find(){
int i;
al=strlen(a);
bl=strlen(b);
if(al>bl)return -1;
ull t=1,ah=0,bh=0,ah1=0,bh1=0;
for(i=0;i<al;i++){
t*=B;
ah=ah*B+a[i];ah1=ah1*B+a[i];
bh=bh*B+b[i];bh1=bh1*B+b[i];
}
for(i=0;i+al<=bl;i++){
if(ah==bh && ah1==bh1)ans++;
if(i+al<bl)bh=bh*B+b[i+al]-b[i]*t;
if(i+al<bl)bh1=bh1*B+b[i+al]-b[i]*t;
}
return ans;
}
int main(){
int i,j,k,m,n;
int t;
scanf("%d",&t);
getchar();
while(t--){
ans=0;
gets(a);
gets(b);
cout<<find()<<endl;
}
return 0;
}
POJ3461 字符串双HASH
最新推荐文章于 2023-07-28 20:20:30 发布