MCOI R4 D
w33z8kqrqk8zzzx33 · · 题解
D:【Dream and Strings】
m=997 部分分
当
如果随机选取长度为
计算期望,得到需要的选取次数是
时间复杂度是期望
正解
首先,把
考虑以上的拓展:如何快速选出来一大堆随机字符串呢?来选出来
例如如果造出来
具体方法:
- 用任意方法构造
O(\sqrt{m}) 级别的长度为25 的前缀以及它们的哈希 - 用任意方法构造
O(\sqrt{m}) 级别的长度为25 的后缀以及它们的哈希 - 注意给定长度为
25 的前缀的哈希与长度为25 的后缀的哈希,长度为50 的整体哈希等于(P\cdot b^{25}+S)\bmod m - 有
T ;想要P\cdot b^{25}+S\equiv T\pmod m - 等价
T-P\cdot b^{25}\equiv S\pmod m - 对所有
S 存一个 set 或者 unordered_set;这样可以直接O(1) 或者O(\log\sqrt n) 时间找到存在不存在一个S 来把前缀补成m 。
为了安全,std 固定生成
可以这样分析成功概率。我们将前缀和后缀抽象为均匀随机函数,整体哈希自然也是均匀随机函数。没有一个碰撞的概率是
其中
则