hash 散列表
一个字符串的hash值:
假设我们取p=13 ,mod=101
先把abc映射为一个整数
hash[0]=1,表示 a 映射为1
hash[1]=(hash[0]*p+idx(b))%mod=15,表示 ab 映射为 15
hash[2]=(hash[1]*p+idx(c))%mod=97
这样,我们就把 abc 映射为 97 这个数字了。
hash值呢?
unsigned long long hash[N];
定义一个unsigned long long类型的变量,它的范围是在[0, 2^64) 内,这就相当于,当数超不过2^64-1后,它会溢出!这就相当于一个数模2^64的过程。
那么hash函数可以理解为:
hash[i]=(hash[i-1]*p)%(2^64)
P取一个大素数,一般习惯取1e9+7或1e9+9
安全指数:三星(所以并不是很安全)
这个之前已经提到过了。
hash[i]=(hash[i-1]*p+idx(s[i]))%mod
hash1[i]=(hash1[i-1]*p+idx(s[i]))%mod1
hash2[i]=(hash2[i-1]*p+idx(s[i]))%mod2
pair<hash1,hash2>表示一个字符串!
解释:
hash1[i]=(hash1[i-1]*p+idx(s[i]))%mod1
hash2[i]=(hash2[i-1]*p+idx(s[i]))%mod2
mod1一般取1e9+7,mod2一般取1e9+9为什么这么取?
1000000007和1000000009是一对孪生素数,取它们,冲突的概率极低!
但请注意,hash的维度越高,耗时越高,耗内存越大!一般情况下,single hash可以被hack掉,但double hash极难被hack掉, 用double hash足以解决问题
根据hash函数去求得一段区间的的 hash 值
#include <cstdio>
#include <cstring>
using namespace std;
#define ll unsigned long long
const ll maxn = 1e6+; char s1[maxn], s2[maxn];
ll p = ;
ll hash[maxn]; ll pp[maxn];
void init() {
pp[] = ;
for(int i = ; i <= ; i++) {
pp[i] = pp[i-]*p;
}
} int main() {
scanf("%s%s", s1, s2);
ll len1 = strlen(s1);
ll len2 = strlen(s2);
init(); ll hash_1 = ;
for(ll i = ; i < len1; i++){
hash_1 = hash_1*p+(s1[i]-'a');
}
printf("hash_1 = %llu\n",hash_1); for(ll i = ; i < len2; i++){
hash[i] = hash[i-]*p+(s2[i]-'a');
printf("+++ i = %llu -> %llu\n", i, hash[i]);
}
ll ans = hash[]-hash[]*pp[];
printf("%llu \n", ans);
return ;
}
/*
qwe
rasqwe
*/
最新文章
- iOS 使用EZAudio库生成wav出错的情况
- Something Wrong or Something Right
- css 之盒子模型
- Windows下JNI执行步骤
- linux 硬盘相关命令学习
- SQL Server R2 2008中的SQL Server Management Studio 阻止保存要求重新创建表的更改问题的设置方法
- NOIP2009 靶形数独
- numpy+scipy+matlotlib+scikit-learn的安装及问题解决
- shell if语句
- sqlite 数据库打开失败
- 《转》前端性能优化----yahoo前端性能团队总结的35条黄金定律
- TreeView无刷新获取text及value
- Android L下载
- JQuery&;原生js ——实现剪刀石头布小游戏
- SSM中的Mybatis的操作
- ORACLE DB体系结构
- 【 python】输出随机的字符或数字
- RETE算法介绍
- CVE-2010-2883
- 初识powershell、nuget powershell 调试
热门文章
- QDUOJ 分辣条-01背包恰好装满情况
- thinkphp5.0 页面缓存
- Unity2D研究院之自动生成动画、AnimationController、Prefab(一)
- bzoj 1901: Zju2112 Dynamic Rankings【整体二分+树状数组||主席树+树状数组】
- 用BeautifulSoup简单爬取BOSS直聘网岗位
- web项目数据存入mysql数据库中文乱码问题
- [BZOJ3128]a+b Problem
- struts2的@Result annotation 如何添加params,并且在页面取值
- python入门之数据类型之列表、元组、字典
- Idea 2017注册码