bryce1010专题——字符串HASH

bryce1010专题——字符串HASH

字符串Hash函数把一个任意长度的字符串映射成一个非负整数,并且其冲突的概率几乎为零。
取一个固定值P,把字符串看作P进制数,并分配一个大于0的数值,代表每种字符。
取一固定值M,求出该P进制数对M的余数,作为该字符串的Hash值。
一般来说,我们取P=131或者P=13331,此时Hash值产生的冲突的概率极低。只要Hash值相同,我们就可以认为原字符串是相等的。通常我们取M=2^64,即直接使用unsigned long long 类型存储这个Hash值。

可以通过O(N)的时间预处理字符串所有的前缀Hash值,并在O(1)的时间内查询他的任意子串的Hash值。

1. 基本Hash模板

CH1401 兔子与兔子
对一个字符串,任意两段子串,得到的两个子串是否相同。

#include
#define MAX 1000010
using namespace std;
char a[MAX];
unsigned long long f[MAX],zifu[MAX];
int n,la,ra,lb,rb,lena;
long long same(int l,int r){
	return zifu[r]-zifu[l-1]*f[r-l+1];
}
int main(){
	scanf("%s",a+1);
	lena=strlen(a+1);
	f[0]=1;zifu[0]=0;
	for(int i=1;i<=lena;i++){
		f[i]=f[i-1]*131;
		zifu[i]=zifu[i-1]*131+(a[i]-'a'+1);
	}
	
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d%d",&la,&ra,&lb,&rb);
		if(same(la,ra)==same(lb,rb)){
		cout<<"Yes"<<endl;	
		}
		else cout<<"No"<<endl;
	}
	
	
	return 0;
}

你可能感兴趣的:(1.7,ACM之路数据结构,1.1)