\[\large \text{Round 13 : AtCoder Regular Contest 171} \]
一言:
我并不是要失去自由,而是要去收获那无可替代的不自由。
——SSSS.电光机王
几年没写了,但是我们仍然要捡回来!
没啥好写的,T1,T2能力范围之内,T3不会,T4感觉很好,但是没做出来。
\(\text{D : Rolling Hash}\)
这题无论是对 \(\texttt{Hash}\) 的转化,还是转化后染色问题的状压想法,都是非常重要的。
首先,看到要求是一段区间的哈希值不为 \(0\),我们考虑定义一个前缀哈希 \(s_i\),其实就是让你 \((s_{r+1}-s_l)\times b^? \not=0\),也就是 \(s_{r+1}\not=s_l\)。
然后由于 \(s_i\) 与 \(a_i\) 本质上是可以做到一一对应的,所以我们看可不可以构造出一个合法的 \(s\) 即可。
然后这题就转化为:有一个点数量为 \(n+1\) 的图和 \(m\) 条边,现可以用 \([0,p]\) 中的任意整数对图上的点进行染色,要求图上边上的两点颜色不同,问有无合法方案。
接下来就是我确实觉得只能用“技巧”来形容的地方:
我们定义 \(dp_{S}\) 表示对所有在 \(S\) 集合中的点进行合法的染色之后,所需要的最少颜色数量。
显然,我们在染色时,只能对一个独立集进行染色,所以我们考虑枚举 \(T\),满足其是 \(S\) 的子集,且是个独立集,然后有 \(dp_{S}=\min\{dp_{S},dp_{T}+1\}\)。
最后看 \(dp[2^{n+1}-1]\) 是否小于等于 \(p\) 即可。
\(\text{What I learned}\)
-
面对一段区间的哈希时,可以转化为 \((s_{r+1}-s_{l})\times b^?\),可能方便处理。
-
面对染色问题,一定想到状态压缩,以及二分图中的一些概念。