长春理工大学第十四届程序设计竞赛D Capture The Flag——哈希&&打表
题目
题意:给定一个字符串 $s$,求不同于 $s$ 的字符串 $t$,使得 $Hash(s) = Hash(t)$,其中 $\displaystyle Hash(s) = \sum_0^{len-1} x_i \times p^i$,$4 \leq p,m \leq 10^9$ 且$m$为质数,所有输入输出的字符串内的字符ASCII码的取值范围为 $[31, 126]$.
分析
由于最终哈希值会模 $m$,所以最多 $m$ 种哈希值,可以先建立起 $\sqrt m$ 个不同哈希值的表。
具体的,利用枚举3位字符串得到 $(126-31)^3 \approx 10^6$个字符串的哈希值,用map存,近似达到 $\sqrt m$ 个哈希值。
先从表中选取一个字符串作为高3位,计算出低3位哈希值应该为多少,在从表中查找这个值,找到一个就退出,最多执行 $10^6$ 次。
那么单次不击中(没找到)的概率为 $\displaystyle \frac{m - \sqrt m}{m}$,因此连续 $10^6$ 次不击中的概率为 $(\frac{m - \sqrt m}{m})^{1e6} = 0.00004539$,这个概率非常小,可认为总能找到答案
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
map<int, string>mp;
vector<ll>vec;
const int L = , R = ;
ll p, m;
string str; //97^3组哈希值,达到sqrt(m)
void dfs(int pos, ll v, ll pw, string s)
{
if(pos >= )
{
mp[v] = s; //hash(s)=v
vec.push_back(v);
return;
}
for(int i = L;i <= R;i++) dfs(pos+, (v + i * pw)%m, (pw * p) % m, s + (char)(i));
} //查找哈希值x是否存在
bool find(ll x)
{
auto it = lower_bound(vec.begin(), vec.end(), x);
return it != vec.end() && (*it == x);
} //求hash(s)
ll Hash(string s)
{
ll ans = ;
ll pw = ;
for(auto ch : s)
{
ans += (ll)ch * pw;
ans %= m;
pw = pw * p % m;
}
return ans;
} int main()
{
cin >> p >> m >> str;
ll h = Hash(str);
//printf("hash: %lld\n", h); dfs(, , , ""); sort(vec.begin(), vec.end()); // ll pw = ;
for(int i = ;i <= ;i++) pw = pw * p % m;
for(auto i : vec)
{
ll v = (h - (i * pw) % m + m) % m;
if(find(v))
{
//string t=mp[v]+mp[i];
//printf("hash2: %lld\n", Hash(t));
cout << mp[v] << mp[i] << endl;
return ;
}
}
}
参考链接:https://zhuanlan.zhihu.com/p/72702597
长春理工大学第十四届程序设计竞赛D Capture The Flag——哈希&&打表的更多相关文章
- 长春理工大学第十四届程序设计竞赛(重现赛)M.Orx Zone
链接:https://ac.nowcoder.com/acm/contest/912/M 题意: Daenerys Stormborn, 风暴中出生的丹尼莉丝,the Unburnt, 烧不死的,Qu ...
- 长春理工大学第十四届程序设计竞赛(重现赛)L.Homework Stream
链接:https://ac.nowcoder.com/acm/contest/912/L 题意: 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图. 很显然,做作业是要有顺序的.作业之 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)J.Printout
链接:https://ac.nowcoder.com/acm/contest/912/J 题意: 小r为了打校赛,他打算去打字社打印一份包含世界上所有算法的模板. 到了打字社,小r一看价格:总打印页数 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)I.Fate Grand Order
链接:https://ac.nowcoder.com/acm/contest/912/I 题意: Fate Grand Order是型月社发行的角色扮演类手机游戏,是著名的氪金抽卡"垃圾&q ...
- 长春理工大学第十四届程序设计竞赛(重现赛)H.Arithmetic Sequence
题意: 数竞选手小r最喜欢做的题型是数列大题,并且每一道都能得到满分. 你可能不相信,但其实他发现了一个结论:只要是数列,无论是给了通项还是给了递推式,无论定义多复杂,都可以被搞成等差数列.这样,只要 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)F.Successione di Fixoracci
链接:https://ac.nowcoder.com/acm/contest/912/F 题意: 动态规划(Dynamic programming,简称dp)是一种通过把原问题分解为相对简单的子问题的 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)B.Bowling Game
链接:https://ac.nowcoder.com/acm/contest/912/B 题意: 链接:https://ac.nowcoder.com/acm/contest/912/B来源:牛客网 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)J
J.Printout 题目:链接:https://ac.nowcoder.com/acm/contest/912/J 题目: 小r为了打校赛,他打算去打字社打印一份包含世界上所有算法的模板. 到了打字 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)I
I.Fate Grand Order 题目链接:https://ac.nowcoder.com/acm/contest/912/I 题目: Fate Grand Order是型月社发行的角色扮演类手机 ...
随机推荐
- [转帖]关于USB3.0以及type-C
忘记来源页面了.. 但是昨天晚上 usb 4.0 发布了 跟雷电C 安全一样的标准 双向40gb 的带宽. 而且 以后只有usb type-C的接口了. 我们办公机器上面的 typeC 同事用 ngf ...
- Linux 下面安装 nginx 以及进行TCP反向代理、负载均衡的过程
1. 下载安装nginx 注意 因为stream 并不是 nginx自带的module 所以需要 在安装是 通过 --with 的方式增加上. 下载必要的程序包 # openssl wget htt ...
- kettle下载地址
kettle 4.4和4.2 版本是好的,版本6.6和8.2 版本有bug Kettle下载和安装: 1.官网各个版本下载地址:https://sourceforge.net/projects/pen ...
- (一)springMvc 底层运作流程
目录 什么是 springMvc SpringMVC的底层运作流程 什么是 springMvc springMvc 是spring 框架的一个模块,这也就意味着二者不需要通过整合层(整合包)进行整合 ...
- 超简单的js实现提示效果弹出以及延迟隐藏的功能
自动登录勾选提示效果 要求:鼠标移入显示提示信息框:鼠标离开,信息框消失,消失的效果延迟 <!DOCTYPE html> <html lang="en"> ...
- k8s之helm入门
1.概述 helm是k8s的另外一个项目,相当于linux的yum,在yum仓库中,yum不光要解决包之间的依赖关系,还要提供具体的程序包,helm仓库里面只有配置清单文件,而没有镜像,镜像还是由镜像 ...
- Iedis - Redis 在IDEA中的可视化工具破解
2.如何破解 // 如果你没有改动IDEA的话,IDEA的插件库在这个目录下C:\Users\Administrator\.IntelliJIdea2017.3\config\plugins\Iedi ...
- python+django学习一
pycharm破解地址:https://blog.csdn.net/qq_32811489/article/details/78636049 按照视频写代码,记录关键的地方方便自己记忆, 视频教程地址 ...
- Eclipse MyEclipse 反编译.class文件 myeclipse source not found
首先,需要下载两个必须的插件包. 一个是:准备反编译需要的jad.exe 下载地址:http://varaneckas.com/jad/ 二个是:反编译编辑器net.sf.jadclipse_3.3. ...
- VBA学习资料分享-5
工作中经常要从数据库把数据跑出来放到EXCEL上,才能进行下一步的操作,那么除了ADO,还有什么方法可以导入数据库数据呢? 推荐使用QueryTable对象 Dim qt As querytable ...