题目

链接

题意:给定一个字符串 $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——哈希&&打表的更多相关文章

  1. 长春理工大学第十四届程序设计竞赛(重现赛)M.Orx Zone

    链接:https://ac.nowcoder.com/acm/contest/912/M 题意: Daenerys Stormborn, 风暴中出生的丹尼莉丝,the Unburnt, 烧不死的,Qu ...

  2. 长春理工大学第十四届程序设计竞赛(重现赛)L.Homework Stream

    链接:https://ac.nowcoder.com/acm/contest/912/L 题意: 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图. 很显然,做作业是要有顺序的.作业之 ...

  3. 长春理工大学第十四届程序设计竞赛(重现赛)J.Printout

    链接:https://ac.nowcoder.com/acm/contest/912/J 题意: 小r为了打校赛,他打算去打字社打印一份包含世界上所有算法的模板. 到了打字社,小r一看价格:总打印页数 ...

  4. 长春理工大学第十四届程序设计竞赛(重现赛)I.Fate Grand Order

    链接:https://ac.nowcoder.com/acm/contest/912/I 题意: Fate Grand Order是型月社发行的角色扮演类手机游戏,是著名的氪金抽卡"垃圾&q ...

  5. 长春理工大学第十四届程序设计竞赛(重现赛)H.Arithmetic Sequence

    题意: 数竞选手小r最喜欢做的题型是数列大题,并且每一道都能得到满分. 你可能不相信,但其实他发现了一个结论:只要是数列,无论是给了通项还是给了递推式,无论定义多复杂,都可以被搞成等差数列.这样,只要 ...

  6. 长春理工大学第十四届程序设计竞赛(重现赛)F.Successione di Fixoracci

    链接:https://ac.nowcoder.com/acm/contest/912/F 题意: 动态规划(Dynamic programming,简称dp)是一种通过把原问题分解为相对简单的子问题的 ...

  7. 长春理工大学第十四届程序设计竞赛(重现赛)B.Bowling Game

    链接:https://ac.nowcoder.com/acm/contest/912/B 题意: 链接:https://ac.nowcoder.com/acm/contest/912/B来源:牛客网 ...

  8. 长春理工大学第十四届程序设计竞赛(重现赛)J

    J.Printout 题目:链接:https://ac.nowcoder.com/acm/contest/912/J 题目: 小r为了打校赛,他打算去打字社打印一份包含世界上所有算法的模板. 到了打字 ...

  9. 长春理工大学第十四届程序设计竞赛(重现赛)I

    I.Fate Grand Order 题目链接:https://ac.nowcoder.com/acm/contest/912/I 题目: Fate Grand Order是型月社发行的角色扮演类手机 ...

随机推荐

  1. 《C++ Primer》读书笔记之第15章:面向对象编程

    一.面向对象概述 1. 面向对象的三个基本特性 封装.继承和多态. 2. 封装 指把隐藏对象的实现细节,仅对外提供接口,从而达到接口与实现分离的效果.封装的好处:一是提高数据的安全性,用户只能使用对象 ...

  2. 记录一次hadoop2.8.4版本RM接入zk ha问题

    背景: 公司将线上hadoop RM接入ZK 实现高可用 但ZK Znode 默认存储1M,当存储数据量大时候可能导致线上业务的崩溃 处理方案如下: 1,修改ZK配置 增加默认存储上限 2,修改RM数 ...

  3. 【AtCoder】AGC003

    AGC编号越小越水???? AGC003 A - Wanna go back home 相对方向要么一起有要么一起没有 #include <bits/stdc++.h> #define f ...

  4. 小米Python后端面试题

    电话面 时长:30m 说一下对浏览器缓存的理解: 说一下MySQL优化: 说一下redis: 说一下从输入url到返回都发生了什么: 域名怎么解析的: 一面 1h 编程实现翻转单链表: MySQL中v ...

  5. 如何配置kindeditor的工具栏

    kindeditor编辑器的工具栏主要是指编辑器输入框上方的那些可以操作的菜单,默认情况下编辑器是给予了所有的工具栏.针对不同的用户,不同的项目,不同的环境,可能就需要保留部分工具栏.那么我们应该如何 ...

  6. 星舟平台的使用(GIT、spring Boot 的使用以及swagger组件的使用)

    一.介绍星舟平台     1.星舟简介     2.网关kong的介绍     3.客户端         1).服务注册:Eureka         2).客户端负载均衡:Ribbon     4 ...

  7. MySQL 聚合函数(三)MySQL对GROUP BY的处理

    原文来自MySQL 5.7 官方手册:12.20.3 MySQL Handling of GROUP BY SQL-92和更早版本不允许SELECT列表,HAVING条件或ORDER BY列表引用未在 ...

  8. 关于typora换行的问题

    neo4j> profile MATCH (liskov:Scientist { name:'Liskov' })-[:KNOWS]->(wing:Scientist)-[:RESEARC ...

  9. [Tarjan系列] 无向图e-DCC和v-DCC的缩点

    上一篇讲了如何应用Tarjan算法求出e-DCC和v-DCC. 那么这一篇就是e-DCC和v-DCC的应用之一:缩点. 先讲e-DCC的缩点. 我们把每一个e-DCC都看成一个节点,把所有桥边(x,y ...

  10. ORACLE通过JOB定时创建序列

    http://blog.csdn.net/cuihaiyang/article/details/7872982 因为业务需要每月需要增加一个序列,想到了使用job定时创建,每次创建一年的.写此job的 ...