知识整理:字符串hash

字符串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\n",hash_ask(l,r));
    } 
}

 

posted @ 2019-08-18 16:23  Isakovsky  阅读(239)  评论(0编辑  收藏  举报