记录编号 455672 评测结果 AAA
题目名称 [POJ 3461] 乌力波 最终得分 100
用户昵称 GravatarHallmeow 是否通过 通过
代码语言 C++ 运行时间 0.611 s
提交时间 2017-10-02 18:01:24 内存使用 16.71 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
#define N 101000
#define pos(i,a,b) for(ULL i=(a);i<=(b);i++)
#define pos2(i,a,b) for(ULL i=(a);i>=(b);i--)
#define ULL unsigned long long
ULL n;
const ULL p=233;
char s[10100],s2[1010000];
ULL hash1[10100],hash2[1010000],xp[1001000];
void gethash1(){//处理出s1的hash 
	ULL len=strlen(s+1);
	hash1[len+1]=0;
	pos2(i,len,1){
		hash1[i]=(hash1[i+1]+(s[i]-'0'))*p;
	}
}
void gethash2(){
	ULL len=strlen(s2+1);
	hash2[len+1]=0;
	pos2(i,len,1){
		hash2[i]=(hash2[i+1]+(s2[i]-'0'))*p;
	}
	xp[0]=1;//处理出p的i次幂 
	pos(i,1,1001000){
		xp[i]=xp[i-1]*p;
	}
}
ULL get1(int i,int j){//取出下标为i~j的hash值 
	return hash1[i]-hash1[j+1]*xp[j+1-i];
}
ULL get2(int i,int j){
	return hash2[i]-hash2[j+1]*xp[j+1-i];
}
int t;
int main(){
	freopen("oulipo.in","r",stdin);
	freopen("oulipo.out","w",stdout);
	cin>>t;
	while(t--){
		scanf("%s%s",s+1,s2+1);
		gethash1();gethash2();
		int ans(0);
		int len1=strlen(s+1),len2=strlen(s2+1);
		pos(i,1,len2){
			if(i+len1-1>len2) break;
			if(get2(i,i+len1-1)==hash1[1]) ans++;
		} 
		cout<<ans<<endl;
	}
	return 0;
}