记录编号 248067 评测结果 A
题目名称 [POJ 3461] 乌力波 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.881 s
提交时间 2016-04-10 07:05:20 内存使用 1.48 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
typedef unsigned long long LL;
char s1[1000000],s2[10005];
const LL mod1=89999981,mod2=333331,base=177777;
LL pow[10005];
LL pow2[10005];
LL pow3[10005];
LL gethash(char s[],int len){
	LL hash=0;
	for(int i=0;i<len;++i){
		hash=hash*base+s[i]-'A';
		hash%=mod1;
	}
	return hash;
}
LL updatehash(LL oldhash,char s[],int pos,int len){
	return ((oldhash+mod1-(s[pos-len]-'A')*pow[len-1]%mod1)*base+s[pos]-'A')%mod1;
}

LL gethash2(char s[],int len){
	LL hash=0;
	for(int i=0;i<len;++i){
		hash=hash*base+s[i]-'A';
		hash%=mod2;
	}
	return hash;
}
LL updatehash2(LL oldhash,char s[],int pos,int len){
	return ((oldhash+mod2-(s[pos-len]-'A')*pow2[len-1]%mod2)*base+s[pos]-'A')%mod2;
}
int main(){
	freopen("oulipo.in","r",stdin);
	freopen("oulipo.out","w",stdout);
	int t;scanf("%d",&t);
	pow[0]=1;
	for(int i=1;i<=10000;++i){
		pow[i]=(pow[i-1]*base)%mod1;
	}
	pow2[0]=1;
	for(int i=1;i<=10000;++i){
		pow2[i]=(pow2[i-1]*base)%mod2;
	}
	while(t--){
		scanf("%s %s",s2,s1);
		int len1=strlen(s1),len2=strlen(s2);
		int hashw=gethash(s2,len2),hashp=gethash(s1,len2);
		int hashw2=gethash2(s2,len2),hashp2=gethash2(s1,len2);
		int ans=0;
	//	printf("%d %d\n",hashw,hashp);
		if(hashw==hashp&&hashw2==hashp2)ans++;
		for(int i=len2;i<len1;++i){
			hashp=updatehash(hashp,s1,i,len2);
			hashp2=updatehash2(hashp2,s1,i,len2);
		//	hashp3=updatehash3(hashp3,s1,i,len2);
		//	printf("%d\n",hashp);
			if(hashp==hashw&&hashp2==hashw2)ans++;
		}
		printf("%d\n",ans);
	}
	fclose(stdin);fclose(stdout);
	return 0;
}