题目

链接

题意:给定一个字符串 $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. Java反射:Web学习的灵魂

    反射:Web学习的灵魂 我们从最初的 javac -HelloWorld.java,到面向对象部分,我们可以将Java代码在计算机中经历的阶段分为三部分:Scource源代码阶段 -- Class类对 ...

  2. 原生js实现图片的3d效果

    <!doctype html><html lang="en"><head><meta charset="UTF-8"& ...

  3. Scala当中parallelize并行化的用法

    [学习笔记] parallelize并行化集合是根据一个已经存在的Scala集合创建的RDD对象.集合的里面的元素将会被拷贝进入新创建出的一个可被并行操作的分布式数据集.例如:val rdd03 = ...

  4. JZOJ.1153【贪心算法】硬币交换

    好难啊!!! 可聪明的我还是解出来了!(逃 题目描述 小z最近迷上了一款游戏――To Be A Farmer,他在游戏中控制的人物是一个叫FZ的Farmer.FZ身上有G1个金币.S1个银币和B1个铜 ...

  5. 【KMP】OKR-Periods of Words

    [KMP]OKR-Periods of Words 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得A=PB.如果P≠A并且P不是一个 ...

  6. Django模型(model)系统

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  7. svg使用

    Vue.component('XSvg', () => import('./abc-svg'))    <x-svg             icon-name="personl ...

  8. 原生 JS 绑定事件 移除事件

    监听事件的绑定与移除主要是addEventListener和removeEventListener的运用. addEventListener语法 element.addEventListener(ty ...

  9. mac 在finder上面显示完成路径

    打开终端,输入以下命令并回车: defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES 然后再把finder关了再打开,你会 ...

  10. python中的not的意思

    python中的not的意思 在python中,not是逻辑判断,用于布尔值true和false,not true是false,not false是true.以下是not的一些常见用法:(1)当表达式 ...