BZOJ3098. Hash Killer II(生日攻击)

article/2025/3/7 5:17:20

Description
这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题:
给你一个长度为N的字符串S,求有多少个不同的长度为L的子串。
子串的定义是S[l]、S[l + 1]、… S[r]这样连续的一段。
两个字符串被认为是不同的当且仅当某个位置上的字符不同。

VFleaKing一看觉得这不是Hash的裸题么!于是果断写了哈希 + 排序。
而hzhwcmhf神犇心里自然知道,这题就是后缀数组的height中 < L的个数 + 1,就是后缀自动机上代表的长度区间包含L的结点个数,就是后缀树深度为L的结点的数量。
但是hzhwcmhf神犇看了看VFleaKing的做法表示非常汗。于是想卡掉他。

VFleaKing使用的是字典序哈希,其代码大致如下:
u64 val = 0;
for (int i = 0; i < l; i++)
val = (val * base + s[i] - ‘a’) % Mod;
u64是无符号int64,范围是[0, 2^64)。
base是一个常量,VFleaKing会根据心情决定其值。
Mod等于1000000007。
VFleaKing还求出来了base ^ l % Mod,即base的l次方除以Mod的余数,这样就能方便地求出所有长度为L的子串的哈希值。
然后VFleaKing给哈希值排序,去重,求出有多少个不同的哈希值,把这个数作为结果。
其算法的C++代码如下:

typedef unsigned long long u64;

const int MaxN = 100000;

inline int hash_handle(const char *s, const int &n, const int &l, const int &base)
{
const int Mod = 1000000007;

u64 hash_pow_l = 1;
for (int i = 1; i <= l; i++)
hash_pow_l = (hash_pow_l * base) % Mod;

int li_n = 0;
static int li[MaxN];

u64 val = 0;
for (int i = 0; i < l; i++)
val = (val * base + s[i] - ‘a’) % Mod;
li[li_n++] = val;
for (int i = l; i < n; i++)
{
val = (val * base + s[i] - ‘a’) % Mod;
val = (val + Mod - ((s[i - l] - ‘a’) * hash_pow_l) % Mod) % Mod;
li[li_n++] = val;
}

sort(li, li + li_n);
li_n = unique(li, li + li_n) - li;
return li_n;
}

hzhwcmhf当然知道怎么卡啦!但是他想考考你。

Input
没有输入。

Output
你需要输出一组数据使得VFleaKing的代码WA掉。我们会使用Special Judge检查你的结果的正确性。
第一行两个用空格隔开的数n、l。
第二行是一个长度为n的字符串。只能包含’a’~‘z’。
需要保证1 <= n <= 10^5, 1 <= l <= n,
不符合以上格式会WA。
不要有多余字符,很可能导致你WA。

Sample Input
没有
Sample Output
8 4
buaabuaa
(当然这个输出是会WA的)
Hint
如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。

Source
VFleaKing & hzhwcmhf

思路:
生日攻击理论,sqrt(n)会有大约50%冲突,于是随机产生一个1e5的字符串即可。
具体公式
在这里插入图片描述
推导过程详见阮一峰博客:http://www.ruanyifeng.com/blog/2018/09/hash-collision-and-birthday-attack.html

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>using namespace std;int main()
{printf("100000 20\n");for(int i = 1;i <= 100000;i++){printf("%c",(rand() % 26 + 'a'));}printf("\n");return 0;
}

http://chatgpt.dhexx.cn/article/l9u6jRWv.shtml

相关文章

生日悖论与Hash函数的攻击

生日悖论与Hash函数的攻击 生日悖论问题什么是生日悖论问题生日悖论问题求解 Hash函数的攻击两个集合相交问题Hash函数的攻击方法Yuval攻击 生日悖论问题 什么是生日悖论问题 假定每个人的生日是等概率的&#xff0c;在不考虑闰年的情况下每年有365天。在k个人中至少有两个人…

消息完整性和哈希函数 哈希碰撞与生日攻击 HMAC (Message Integrity and Hash Function)

消息完整性和哈希函数 1. Message Integrity - 消息的完整性1.1 消息安全性和消息完整性的联系 2. Message Authentication Code - 消息认证码2.1 Defination2.2 MAC 安全的定义2.2 Replay Attacks - MAC的不足2.3 MAC Contruction for Fixed-length Message2.4 (Basic) CBC - …

哈希碰撞与生日攻击

一、哈希碰撞是什么&#xff1f; 所谓哈希&#xff08;hash&#xff09;&#xff0c;就是将不同的输入映射成独一无二的、固定长度的值&#xff08;又称"哈希值"&#xff09;。它是最常见的软件运算之一。 如果不同的输入得到了同一个哈希值&#xff0c;就发生了&q…

用生日攻击方法求解离散对数问题(C语言实现)-大三密码学实验

实验原理&#xff1a; 生日攻击&#xff1a;输入为生成元a的阶p-1和元b&#xff0c;输出为离散对数。设置两个长度为p的列表&#xff1a; 1&#xff09;列表1包含&#xff0c;通过随机选取p个k得到&#xff1b; …

抗碰撞性、生日攻击及安全散列函数结构解析

回顾一下&#xff0c;密码学的上篇是完整性&#xff0c;完整性的保证是由一段定长的散列&#xff0c;俗称tag来确定的。又因为tag是定长的&#xff0c;而需要确保完整性的内容种类却可以认为是无限的。因此总有tag(mi)tag(mj)&#xff0c;mi ! mj&#xff0c;因此我们要引入抗碰…

密码学之生日攻击 离散对数问题求解 python实现

生日攻击 离散对数问题&#xff08; DLP &#xff09; 给定素数 p, α \alpha α, β \beta β 是模 p 非零的整数&#xff0c;令 β α x m o d p \beta \alpha^x\mod p βαxmodp &#xff0c;则求 x 的问题称为离散对数问题。 生日攻击是一种密码攻击&#xff0c;它利…

Hash函数与生日攻击

简介 Hash函数也叫杂凑函数、散列函数、哈希函数&#xff0c;可以把消息或数据压缩成固定长度的摘要 性质 等长性&#xff1a;给出任意的输入&#xff0c;得到的输出&#xff08;摘要&#xff09;长度不变。比如sha-1得到的摘要固定是160位&#xff0c;md5为128位单向性&#…

【Hash函数与生日攻击】

文章目录 一、Hash函数Hash函数关于密钥s散列函数定义碰撞发现实验-可忽略的散列函数安全性的三个典型的安全水平通用生日攻击 参考文献 一、Hash函数 Hash函数 将任意长度字符串压缩成短字符串的函数 关于密钥s 散列函数定义 碰撞发现实验-可忽略的 最强的安全性要求&…

生日攻击理解

1.什么是哈希碰撞&#xff1f;产生哈希碰撞的原因是什么&#xff1f;如何避免&#xff1f; 两个不同的输入&#xff0c;经过哈希算法后&#xff0c;得到了同样的哈希值&#xff0c;就叫做哈希碰撞。由于通常的哈希算法中&#xff0c;哈希值的空间远小于输入的空间&#xff0c;这…

哈希碰撞与生日相同概率

一、哈希碰撞是什么&#xff1f; 所谓哈希&#xff08;hash&#xff09;&#xff0c;就是将不同的输入映射成独一无二的、固定长度的值&#xff08;又称"哈希值"&#xff09;。它是最常见的软件运算之一。 如果不同的输入得到了同一个哈希值&#xff0c;就发生了&q…

密码学系列之:生日攻击

简介 生日攻击其实是一个概率论的问题&#xff0c;也就是说一个看起来很难发生的事情&#xff0c;事实上它发生的概率却很大。这种主观上和事实上的概率差距&#xff0c;让随机攻击成功的几率变的更高&#xff0c;这样的攻击就叫做生日攻击。 生日问题的由来 生日问题也叫做…

linux 清空redis缓存

1&#xff0c;进入目录redis下src目录。 #cd redis-2.8.17/src 2&#xff0c;执行redis-cli文件 #./redis-cli 3&#xff0c;执行命令&#xff1a;flushall&#xff0c;出现OK代表执行成功 #flushall 4&#xff0c;退出命令exit #exit 实例&#xff1a;

【redis】linux服务器清空redis

redis-cli 进入redis命令行 flushall 清除所有 如果报出“NOAUTH Authentication required.”错误&#xff0c;那么需要用密码授权 使用 auth [密码] 就可以继续操作了

redis数据清空脚本

redis服务经常因服务器内存不够用而自动死掉。需要经常连接进去做数据清理后启动服务。 所以写了个脚本每天清理一遍。 echo "flushall" | redis-cli -p 7000 -a password echo "flushall" | redis-cli -p 7001 -a password echo "flushall" |…

docker部署python程序清空redis数据

这里还是要推荐下小编的Python学习群: 823137423,不管你是小白还是大牛,小编我都欢迎 ,不定期分享干货,包括小编自己整理的一份2019年最新的Python资料和0基础入门教程视频,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。 docker部署python程序清空redis数据 线…

Windows 清空Redis数据

1.redis安装目录下输入cmd 2.redis-cli -p 端口号 3.flushdb 清除当前数据库缓存 4.flushall 清除整个redis所有缓存

Laravel 清空 Redis 队列

先说问题&#xff0c;我的网站搜索使用的 Laravel Scout Algolia 因为 Algolia 是收费的&#xff0c;免费版有容量限制。免费版应该是如下的限制&#xff1a; 一旦你的 计划超出配额&#xff0c;那么 Laravel 队列就会一直失败。失败他会重试导致 &#xff0c;队列一直累加、…

教你Redis 如何清空所有数据

这篇文章主要介绍了Redis 如何清空所有数据&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。如有错误或未考虑完全的地方&#xff0c;望不吝赐教 Redis 清空所有数据步骤总结 1、打开cmd 命令窗口&#xff0c;切换至Redis 安装目录下的bin文件夹 2、在cmd 命…

lnx的导数证明

https://zhidao.baidu.com/question/524121644.html