首页 > 其他 > 详细

知识整理:字符串hash

时间:2019-08-18 19:07:27      阅读:88      评论:0      收藏:0      [点我收藏+]

字符串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));
    } 
}

 

知识整理:字符串hash

原文:https://www.cnblogs.com/isakovsky/p/11372791.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!