字符串hash唯一用途是快速判断两字符串是否相等,但存在极小概率假阳性(本来不相等,但算法返回相等)。
根本思想是把一个字符串转换为一个整数,要求相同的字符串,对应的这个整数相同,不同的字符串,对应的这个整数不同。
#include<bits/stdc++.h> #define BASE 2 #define MOD 1000000007 #define LL long long #define MAXN 300005 using namespace std; int hash[MAXN]; char s[MAXN]; int qpow(int base,int n){ LL ans=1; while(n){ if(n&1)ans=(ans*base)%MOD; base=(1LL*base*base)%MOD; n>>=1; } return ans; } int hash_ask(int l,int r){ if(l==0)return hash[r]; else{ int ans=(1LL*hash[r]-hash[l-1]+MOD)%MOD; int rev=qpow(BASE,l); rev=qpow(rev,MOD-2); ans=1LL*ans*rev%MOD; return ans; } } int hash_init(int len){ hash[0]=s[0]; for(int i=1;i<len;i++){ hash[i]=(0LL+hash[i-1]+s[i]*qpow(BASE,i)%MOD)%MOD; } } int main(){ scanf("%s",s); hash_init(strlen(s)); while(1){ int l,r; scanf("%d %d",&l,&r); printf("%d ",hash_ask(l,r)); } }