随机化以及和概率相关的东西(长期更新)
Hash
一点小感受:Hash就是去找问题的必要条件(这一般是很好满足的),然后发现在满足必要条件的情况下有很大概率是充分的。
字符串Hash
等着补。
Xor Hashing and Sum Hashing
奇妙的东西。
可以快速找一个组合是否出现/某个数是否出现\(k\)次这种与具体的顺序无关的问题。
找排列
找到所有区间\([l,r]\)使得\(a_l\dots a_r\)是\(1,2\dots r-l+1\)的一个排列。
朴素的枚举就不提了。
我们发现原问题的一个必要条件是\(\bigoplus\limits_{i=l}^r a_i=\bigoplus\limits_{i=1}^{r-l+1} i\)
然而这并不是充分的,如\(1\oplus 2=5\oplus 6\)。
这是因为异或的结果集不超过\(2n\),而不同的区间有\(\frac{n(n-1)}{2}\),发生冲突的概率很大,于是启示我们扩大异或的结果集。
我们将每个数映射到\([0,2^{64}]\)中的一个整数,于是结果集扩大到\(2^{64}\),冲突的概率很小了。
以上是xor hash的想法,对于这道题,我们继续优化。我们发现对于一段区间想要合法,那么必要条件是其中有\(1\),且最大值等于区间长度。
那么我们对于最大值在\(1\)的左侧和右侧分开做。显然序列中的\(1\)将序列分成了几段。考虑只记录每个\(1\)右侧的最大值,枚举右端点,每次检查当前是否有\(1\)且是否最大值(即区间长度)可以覆盖到\(1\)。当遇到新的一个\(1\)时,由于之前已经有\(1\),于是不可能构成排列,所以扔掉前一个\(1\)的信息,重新开始。
于是做完了,\(O(n)\)。

浙公网安备 33010602011771号