毒瘤养成记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内可以处理六百万个订单,性能相当感人. 这个框架的结构大概是:数据生产端 --> 缓存 --> 消费端 缓存中 ...
随机推荐
- Spring Security 5中 PasswordEncoder的使用
在最新的 Spring Security 5发布版本中, 出于安全性的考虑调整了PasswordEncoder的实现与使用策略. 1.以前常用的实现 StandardPasswordEncoder, ...
- element el-table 添加分页连接的序号,清除sortable排序
先看代码: <el-table :data="tableData" style="width: 100%" stripe size="mediu ...
- Vue中qs插件的使用
qs 是一个增加了一些安全性的查询字符串解析和序列化字符串的库. 在项目中使用命令行工具输入:npm install qs安装完成后在需要用到的组件中:import qs from ‘qs’具体使用中 ...
- dotnet 控制台读写 Sqlite 提示 no such table 找不到文件
在使用 dotnet 读写 Sqlite 可以通过 EF Core 的方法,但是在 EF Core 创建的数据库可能和读写的数据库不是相同的文件 在我运行代码的时候发现在通过迁移创建数据库,创建的文件 ...
- koa2--04.ejs模板引擎
首先在项目文件下使用cmd,输入:npm install --save koa-views ejs,将koa-views中间件和ejs模板引擎安装到文件中,并自动写入依赖 接在在index.js文件中 ...
- UVA live 6667 三维严格LIS
UVA live 6667 三维严格LIS 传送门:https://vjudge.net/problem/UVALive-6667 题意: 每个球都有三个属性值x,y,z,要求最长的严格lis的长度和 ...
- 第二阶段:2.商业需求分析及BRD:4.产品需求分析总结
产品的需求筛选 战略定位要考虑公司的战略问题.产品定位要分阶段,各个阶段的需求不同. 其实现在需求分析跟筛选都是非常快的. 不把需要当成需求,意思就是不要用户说需要什么就是什么,用户需要引导. 先分类 ...
- 微服务Dubbo和SpringCloud架构设计、优劣势比较
本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...
- Java 连接 SQL Server 数据库
//连接数据库 public Connection getConnection(){ //url为绝对路径 String url="jdbc:sqlserver://127.0.0.1:14 ...
- 关于SAM和广义SAM
关于SAM和广义SAM 不是教程 某些思考先记下来 SAM 终于学会了这个东西诶...... 一部分重要性质 确定一个重要事情,S构造出的SAM的一个重要性质是当且仅当对于S的任意一个后缀,可以从1号 ...