毒瘤养成记1: 如何卡hash
各位毒瘤大家好, 最近模拟赛考了一道trie+主席树好题, 但大家都用hash水过了这道题(包括我), 为了测试一下新搭建的HEAT OJ的hack功能, 我将继续扮演毒瘤的角色, 用毒瘤的艺术形象努力创造一个正能量的形象, 文体两开花, 弘扬中华文化, 右转去BZOJ搞了一晚上hashkiller, 回来卡了单哈希(双哈希是真滴卡不住
哈希(hash) :
利用大质数或其他对应函数把字符串转为一个正整数来快速判断字符串相等
通常可以模一个大质数或使用自然溢出
实现(例);
const int P = 1e9+7;
const int di = 1331;
hash[i] = (hash[i-1] * base + s[i]) % P;
其中\(base\), 我称之为底数, P我称之为模数, 事实上自然溢出相当于模了\(2^{64}\)
卡哈希的思想:
- 数学构造
- 随机数据(依据生日悖论
Part 1 生日悖论:
如果一个班级有23个人, 那么其中有两个人生日相同的概率超过50%
surprise 这与大部分人的直觉相违背, 所以称之为生日悖论
为什么会这样呢, 是自己的直觉不靠谱吗?
不, 我们可以考虑另一个问题, 如果一个班里有23人包括自己, 有人生日和自己相同的概率是多少?
没错, 大概为\(6%\)左右, 这是与直觉近似的, 其实我们的直觉正是把"有人生日相同"和"有人生日和自己相同"的概念相混, 实际有人生日和自己相同的概率确实很小
证明可以用排列组合开心的手玩一下
性质:
样本容量为\(n\), 超过\(50%\)概率有两个样本相同的概率为
\]
Part 2 卡大质数hash (1000000009) :
考虑生日攻击, 随机一个1e5大小的字符串, 询问长度为\(L\)的本质不同子串有多少个, 用大质数\(hash\)和后缀数组(也可以用自然溢出\(hash\))对拍, 输出不同子串的终止位置, 拿\(fc\)命令对比一下, 找出\(hash\)值相等的不同子串
正确性如生日悖论, 大概有超过\(50%\)的几率成功, 实际上质数不强的时候有很多相同
Part 3 卡自然溢出hash:
自然溢出\(hash\)在数据随机的情况下正确性极高, 因为它的值域很大, 很难生日攻击
考虑特殊构造:
对于底数为偶数:
构造\(aaaa\cdots aaaa\) 和 \(baaa\cdots aaaa\)两个长度相等且长度大于64的串
底数的六十四次方以上模\(P\)就会为零, \(b\)和\(a\)也会被判为相等
对于底数为奇数:
不太好卡, 要用神仙的构造方法:
设一个串\(s[]\), \(s[1] = 'a'\) 设$ |s| = strlen(s + 1)$ 为\(s\)的长度
定义$ (!s)$ 为\(s\)中的字符全部\('a'变'b', 'b'变'a',\) 当然\(s\)中只含有\('a'\)和\('b'\)两种字符
定义串\(S1 + S2\)为\(S1\)串在前\(S2\)串在后拼接起来, \(hash(s1)\) 为\(s1\)的哈希值
类似数列的, 我们定义一个"字符串列", 为一个字符串集合{\(S_n\)}, 后一个字符串可以通过前一个字符串推出
\(S_1 = "a"\)
\]
则\(S_i\)的长度为\(2^{i-1}\)
= hash(S_{i-1}) * base^{2^{i-2}} + hash((!S_{i-1})) \\
hash((!S_{i-1})) = hash((!S_{i-2})) * base^{2^{i-2}} + hash(S_{i-1}) \\
hash(S_i) - hash((!S_{i-1})) = (hash(S_{i-1}) - hash((!S_{i-2}))) * base^{2^{i-2}} - (hash(S_{i-1}) - hash((!S_{i-2})))\\
hash(S_i) - hash((!S_{i-1})) = (hash(S_{i-1}) - hash((!S_{i-2}))) * (base^{2^{i-2}} - 1)
\]
希望得到 \(2^{64} | hash(S_i) - hash(!S_i)\) 设\(g_i = hash(S_i) - hash(!S_i)\)
\(g_i=g_{i-1}*(base^{2^{i-2}}-1)\) 每个 \((base^{2^{i-2}}-1)\) 都是偶数, 这使得g到第64项就就可以卡掉hash了,
但事实上12位以上就行, 因为
\]
为一个偶数乘一个偶数, 而左边的可以继续递归下去, 所以原式整除\(2^i\) 然后就结束啦
长大后, 我要当毒瘤, 爷爷奶奶可高兴了, 给我爱吃的...
毒瘤养成记1: 如何卡hash的更多相关文章
- 2016级算法第六次上机-F.AlvinZH的学霸养成记VI
1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...
- 2016级算法第六次上机-D.AlvinZH的学霸养成记V
1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...
- 2016级算法第六次上机-C.AlvinZH的学霸养成记II
1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时cu ...
- 2016级算法第五次上机-E.AlvinZH的学霸养成记IV
1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...
- 2016级算法第五次上机-D.AlvinZH的学霸养成记III
850 AlvinZH的学霸养成记III 思路 难题.概率DP. 第一种思考方式:直接DP dp[i]:从已经有i个学霸到所有人变成学霸的期望. 那么答案为dp[1],需要从后往前逆推.对于某一天,有 ...
- nlp算法工程师养成记 目标要求
时间规定: 2018.12.07-2018.02.15 能力养成: linux, shell python, c++(会多少算多少) tensorflow, keras, pytorch(tf优先) ...
- 架构师养成记--35.redis集群搭建
前记:redis哨兵经验之谈.哨兵做主从切换可能要花费一两秒,这一两秒可能会丢失很多数据.解决方法之一是在java代码中做控制,try catch 到 链接断开的异常就sleep 一两秒钟再conti ...
- 架构师养成记--31.Redis的几种类型
String类型 Redis一共分为五种基本数据类型:String.Hash.List.Set.ZSet String类型是包含很多张类型的特殊类型,并且是二进制安全的.比如对序列化的对象进行存储,比 ...
- 架构师养成记--15.Disruptor并发框架
一.概述 disruptor对于处理并发任务很擅长,曾有人测过,一个线程里1s内可以处理六百万个订单,性能相当感人. 这个框架的结构大概是:数据生产端 --> 缓存 --> 消费端 缓存中 ...
随机推荐
- Python--day38--JoinableQueue解决生产者消费者模型
############################# # 在消费者这一端: #每次获取一个数据 #处理一个数据 #发送一个记号:标志一个数据被处理成功 #在生产者这一端: #每一次生成一个数据 ...
- H3C FTP配置示例
- 使用Squid做代理服务器,Squid单网卡透明代理配置详解(转)
使用Squid做代理服务器 说到代理服务器,我们最先想到的可能是一些专门的代理服务器网站,某些情况下,通过它们能加快访问互联网的速度.其实,在需要访问外部的局域网中,我们自己就能设置代理,把访问次数较 ...
- Openstack生产环境部署(一)
- 记录安装Python第三方包“tesserocr”的方法和遇到的坑
1. 环境: 系统环境:Win7 32 位系统 Python版本: 3.6.5 虚拟环境为:Miniconda3 2. 共需要安装的模块: a. tesserocr b. tessera ...
- 一篇长文说 git 基础
版本管理在产品级开发中是非常重要的一个部分,它涉及到团队协作,且影响到产品最终的发布.上线以及测试环节,当前最流行的版本控制系统是 git.git 内容非常多,本文尽量克制地来介绍 git 的基础内容 ...
- mysql主从之配置基本环境
实验环境 master 192.168.132.121 主库 slave 192.168.132.122 从库 一 mysql的使用介绍 1.1 mysql单台服务器特点 缺点 单台服务器如 ...
- 从零开始のcocos2dx生活(六)EventDispatcher
EventDispatcher可能是所有的里面比较不容易理解也不容易看的 我说自己的理解可能会误导到你们-[索了你们看不下去>< 我写了几乎所有的代码的注释,有的是废话跳过就好 主要的代码 ...
- 全网最详细的Ceph14.2.5集群部署及配置文件详解,快来看看吧! -- <2>
部署Ceph集群 Ceph版本选择 Ceph版本来源介绍 Ceph 社区最新版本是 14,而 Ceph 12 是市面用的最广的稳定版本. 第一个 Ceph 版本是 0.1 ,要回溯到 2008 年 1 ...
- CF1272E. Nearest Opposite Parity 题解 广度优先搜索
题目链接:http://codeforces.com/contest/1272/problem/E 题目大意: 有一个长度为n的数组 \(a\) ,数组坐标从 \(1\) 到 \(n\) . 假设你现 ...