加载中...
On the mathematics behind rolling hashes and anti-hash tests
This blog assumes the reader is familiar with the basic concept of rolling hashes. There are some math-heavy parts, but one can get most of the ideas without understanding every detail. The main focus of this blog is on how to choose the rolling-hash parameters to avoid getting hacked and on how to hack codes with poorly chosen parameters. Designing hard-to-hack rolling hashes Recap on rolling hashes and collisions Recall that a rolling hash has two parameters (p, a) where p is the modulo and 0  ...
关于滚动 Hash 和反 Hash 测试背后的数学原理
本博客假设读者熟悉滚动 Hash 的基本概念。有些部分涉及大量数学知识,但无需了解每个细节即可掌握大部分概念。 本博客主要关注如何选择滚动 Hash 参数以避免被 Hack ,以及如何选择不当的参数 Hack hash。 设计难以破解的滚动 Hash 回顾滚动 Hash 和 Hash 碰撞 回想一下,滚动 Hash 有两个参数 (p, a),其中 p 是模数,0 ≤ a < p 是基数。 (我们将看到 p 应该是一个大素数,并且 a 应该大于字母表的大小。) 字符串 S = s0⋯sn − 1 的 Hash 值由以下公式给出: $$ h(S) = (\sum^{n-1}_{i=0} a^{n-i-1} s_i) \mod P $$ 现在,让我们考虑一个简单的问题:给定两个长度相等的字符串 S, T,通过比较它们的 Hash 值 h(S), h(T) 来判断它们是否相等。如果 h(S) = h(T),我们的算法将 S 和 T 声明为相等。大多数滚动 Hash 解决方案都是基于对此子问题的多次调用或依赖于此类调用的正确性。 让我们将两个长度相等的字符串 S, T 称为 等长碰撞(或 ...
Vim 入门
简介 Vim 是一款功能强大的文本编辑器,其功能和操作方式与传统的编辑器有 很大不同。 但如果熟练之后,速度将大大提高,甚至更快(因为 DEV 没有自动补全)。 部署 Linux NOI 的官方镜像 NOI LINUX 2.0 自带 Vim,如果需要在 Ubuntu 上自己安装,使用: 1$ sudo apt install vim Windows 如果不想装虚拟机,可以用 Windows 下的 gVim,操作和 Vim 一样,但是更加适合初学者。 官网:https://www.vim.org/download.php 使用 打开 Linux 的终端,输入: 1$ vim filename Vim 就会打开 filename 文件。若不存在,则会自动创建。 模式 Vim 有四种模式: 命令模式(Command Mode) 底线命令模式 插入模式(Insert Mode) 可视模式(Visual Mode) 当我们首次进入 Vim,观察到左下方应该是一片空白,此时就是命令模式。 命令模式(Command Mode) 这是 Vim 的默认模式,在其他三种模式下,按 Esc 键就能回到命 ...
splay
前言 总所周知,平衡树是一个喜闻乐见的算法,它种类多样,功能强大,应用广泛。 介绍 Splay 树(伸展树),是一种平衡二叉查找树,它通过 Splay/伸展操作 不断将某个节点旋转到根节点,使得整棵树仍然满足二叉查找树的性质,能够在均摊 O(log N) 时间内完成 插入,查找 和 删除 操作,并且保持平衡而不至于退化为链。 Splay 树由 Daniel Sleator 和 Robert Tarjan 于 1985 年发明。 Splay 树的 基本思想 是:每次操作都将某节点旋转到根节点,使得整棵树仍然满足二叉查找树的性质。 操作 记号规定 rt:根节点 tot:树的总节点数 fai:节点 i 的父节点 chi, 0:节点 i 的左孩子 chi, 1:节点 i 的右孩子 vali:节点 i 的值 cnti:值 i 出现的次数 szi:以节点 i 为根的子树的权值个数(包括重复权值) 基本操作 pushup(x) :更新节点的 sz 1void pushup(int x) { sz[x] = sz[son[x][0]] + sz[son[x][1]] + cnt[x] ...
2024.8.7-A
欧几里得 algorithm:math 设棋子总共向左移动了 a 次,最终的落地为: s − ax + y(n − a) = s + ny − a(x + y) 容易发现落点对 x + y 的取模结果不变,而 [t − x.t + y) 区间内对 x + y 取模结果两两不同,二分答案即可。 容斥原理 algorithm:dp 一道思维难度大,码量奇小的题目。 由于答案是对 2 取模,容易发现
好文收集
介绍 这里放了很多不错的文章。 字符串 A tool for hacking rolling hashes with fixed modulos and bases On the mathematics behind rolling hashes and anti-hash tests 图论 2-SAT 超入门讲解
2024.8.5-A
T1 一切大师 algorithm:math 考虑将原式转换: $$ \begin{aligned} ans &=\sum_{a=1}^{L}\sum_{b=1}^{L}[lcm(a,b)]*|ax-by|\\ &= \sum_{d=1}^{L}\sum_{a=1}^{\left \lfloor \frac{l}{d}\right \rfloor}\sum_{b=1}^{\left \lfloor \frac{l}{ad}\right \rfloor}[\gcd(a,b)=1]*d*|ax-by|\\ \end{aligned} $$ 直接爆算,发现 TLE。 预处理 $\sqrt{L}$ 以内的 gcd ,再卡一下常,即可过掉。 T2 你考它干嘛 暂缺 T3 digital 喜闻乐见的模拟题 algorithm:divide-and-conquer 一个区间众数为 1,当且仅当 1 的个数大于等于 $\left \lfloor \frac{n+1}{2}\right \rfloor$。 考虑分治,设 solve(l, r, x) 表示区间 [l, r] 内有 x ...
2024.8.1-A
考虑构造一道毒瘤题,它拥有 T1 的时间复杂度分析,T2 的数学推导,T3 的代码难度,T4 的卡常。 T1 往事成风 algorithm:segtree 结论题,下面给出三个结论: 在最优划分中,每个区间的众数都是不同的,否则显然可以合并到一起减小答案。 若不考虑编号的限制,我们将某些数字选为最后的众数。若这个方案合法,没有被选为众数的数的个数的最大值一定小于等于选出的众数的个数之和。 这样我们可以得到一个朴素算法,对于每次询问,从高位向地位枚举,如果将当前数字删去后仍满足条件,则删去。最后保留的数字即为众数。 设 V 为值域,所有删去的数字形成的连续段数量级为 $O(\sqrt{V})$。(我不会证) 考虑优化朴素算法,我们在线段树上删除连续段: 1. 若删去当前节点最小值仍不满足,直接返回。 2. 若将右子树删除满足条件,删去它并遍历左节点。 3. 否则先遍历右子树,再遍历左子树。 T2 数数乐(eval) algorithm:math $$ f(n)=\sum_{k=0}^n 2^{n-k}\sum_{m=0}^k \binom{k}{m}\binom{k-m}{\lf ...
2024.7.31-A
T1 United Cows of Farmer John algorithm: segtree 一道非常神奇的数据结构题。 考虑枚举每个区间的右端点,设当前点为 i,值为 vi,上一个 vi 的位置为 prei。 显然,左端点只能在 (prei, i − 1] 这个范围内。 当我们加入点 i,那么 (prei, i − 1] 中左端点的方案数均可以加 1,线段树维护即可。 但有一个问题,左端点不一定是连续的,所以我们再维护一个 0/1 的系数,表示这个点能否作为左端点。 T2 Permutation algorithm: dp 考虑答案的图应该长什么样子: 首先有一个三角形,每次选择一个点,分类讨论: 在三角形内,图还是一个三角形。 在三角形外,它会与原三角形的两个顶点构成一个新的三角形。 就两种情况,我们可以用动态规划来解决。 设 dpp, i, j, k 为当前已经计算了 i 个点,答案为 i, j, k 三个顶点构成的三角形。 内部转移,相当于把 l 取出后,在 i, j, k 中随便选一个点,预处理三角形内部的点的数目即可。 格外注意,预处理时请用标准的计算几何方法,不 ...
2024.7.30-A
T1 Promotion Counting algorithm: segtree, BIT 水题,树状数组差分即可。 T2 rabbit algorithm: network-flow, greedy 乱搞。 将数据用桶装起来,枚举胡萝卜或干草,与另一个分别相减。 网络流?不会(好像是最小割)。 T3 【2024年SD省队集训 day2】反转了 (flip) algorithm: PST, divide-and-conquer 先考虑朴素算法,若当前前缀和右端点为 i,则反转的肯定为 [1, i] 间最小的 k 个数,用主席树计算,时间复杂度 O(n2log n)。 发现有决策单调性,第 k + 1 次反转的最优右端点 一定大于 等于第 k 次反转的右端点。 证明:https://lnw143.github.io/blog/gmoj/p8081/#%E5%8D%95%E8%B0%83%E6%80%A7%E8%AF%81%E6%98%8E 考虑分治,设函数 solve(l,r,L,R)。 每次把求 $k = \frac{l+r}{2}$ 的答案,暴力跑 [L, R] 区间,求出答案。 T ...
字符串 Hash 的攻击
强烈建议尝试 Luogu U461211 字符串 Hash(数据加强) 前言 某天看到同学打 字符串hash,发现还在用 腐朽 的 单模数hash。 为了帮助他改进码风,我决定 卡炸hash。 一、大模数哈希 1.前言 我们知道,要想卡掉 hash,本质上就是让两个字符串有相同的 hash 值,我们称为哈希碰撞。 假设 hash 中每个值生成概率相同,则碰撞概率取决于两个因素: - 取值空间大小 - hash 的计算次数 这个问题在数学中有一个经典的问题,叫 生日问题。 简单来说,就是在一个有 d 人的班中,有人生日相同的概率为多少。 实际上,这个问题的答案并没有想象中的小,下面是部分概率: | 人数 | 概率 | | :—: | :——: | | 23 | 50% | | 50 | 97% | | 70 | 99.9% | 2.计算冲突概率 我们设 hash 的取值空间为 d,计算次数为 n。 则 hash 不冲突的概率为: $$ \overline{p}(n,d) = 1 \cdot \left (1 - \frac{1}{d} \right) \cdot \left ( 1- ...
Windows 10 美化
avatar
星光light
星光照耀,灿烂前行
Follow Me
最新文章
网站资讯
文章数目 :
38
已运行时间 :
本站总字数 :
33.7k
本站访客数 :
本站总访问量 :
最后更新时间 :