省选模拟86 题解
A. 人生
有一点 dp 套 dp 的意思,内层的 dp 就是直接在拓扑序上进行的简单 dp。
外层记录的是 dp 的状态,然后 $O(n^3)$ 的做法是显然的。
当转移到第 $i$ 个位置的时候,只要关心前面有多少个黑点 dp 值为 $1$,前面有多少个白点 dp 值为 $1$,前面的 dp 值总和的奇偶性。
然后写一下转移系数,发现这个玩意是一个简单的组合恒等式,与具体多少个异色点无关,只与是否有异色点有关。
所以可以把 dp 的多少个改成是否存在,然后直接转移就行了。
B. 赢家(winner)
考虑怎样的方案是不合法的,其实就是 $1$ 能到达的点集与 $2$ 能到达的点集无交。
可以用 dp 处理出两个集合内部的方案数,然后对于全集减去两个点集内部的边,方向任意。
两个集合之间不能有任何边,两个集合到全集减去两个点集之间的边方向唯一。
然后问题是处理出从点 $i$ 通过 $S$ 内部的边恰好到达集合 $S$ 的方案数,求的方法是直接用全集-补集。
补集其实就是枚举 $S$ 的一个子集 $T$,使得通过 $S$ 之内的边只能到达集合 $T$。
那么 $S-T$ 连边任意,$T$ 内连边是已经处理过的方案数,$T$ 和 $S-T$ 之间的边的方向也是唯一的。
C. 黑红兔
有这样一个性质,答案中的字符串长度可以是连续的。
所以可以认为 $[l,r]$ 的后继是 $[l+1,r]$ 或者 $[l,r-1]$。
然后正着进行 dp 并不容易处理,所以倒过来 dp,每次只要选择一个后继。
令 $f_{i,len}$ 表示以 $i$ 为起点,长度为 $len$ 是否存在,取值为 $0/1$。
然后有这样一个性质,枚举了一个左端点 $i$,那么取值为 $1$ 的 $f_{i,len}$ 是一段前缀。
所以其实只要令 $f_i$ 表示左端点为 $i$ 的最大的 $len$。
假设 $f_i=k$,那么限制就是从 $s[i+k:n]$ 中找到 $s[i,i+k-2]$ 或者 $s[i+1,i+k-1]$,并且这个点的 $f$ 值应该 $\geq k-1$。
解决这个东西的方法是二分答案,还有一个问题是字符串的限制。
其实就是使得 $lcp \geq k-1$,所以写一个后缀自动机就可以转化为 DFS 序上一段连续的区间,然后写一个主席树就可以做到两个 $log$ 了。
然后优化的方法是继续找性质,有 $f_i \leq f_{i+1}+1$,所以只要把二分改成暴力判断即可。