DP 套 DP 还是蛮有趣的(
可以先不考虑不含 NOI 子串的限制。(这时其实是个丽洁姐的原题)
注意到 LCS 不太方便用状态表示,于是可以考虑造一个 LCS 自动机。
考虑传统的 O(|A||B|) 求串 A,B LCS 的 DP 方法: fi,j=max{fi−1,j,fi,j−1,fi−1,j−1+[Ai=Bj]}
注意到这个 DP 仅涉及到两个串的上一个字符,并且此题中有一个串是固定的,那么可以把另一个串对应的维度看做一个自动机上的结点。
麻烦的是,空间会很大,而且难以得出结点数的上界。
再次考虑 f 的定义,容易发现数组 fi 的差分数组一定非 0 即 1,所以可以考虑状压(K≤15)。
这样就会得到一个比较松但是足够用的上界,即 215。
(经实测本题数据中最多的结点数不超过 5000)
然后 BFS 建自动机即可。
解决了自动机的问题之后,考虑设 gi,j 表示兑奖串的前 i 位能走到自动机上的结点 j 的方案数。
那么转移时仅需要枚举新的字符并走后缀自动机上的边即可。
然后涉及到不含 NOI 子串的限制。
——实际上也很简单,只需要新增一维表示当前后缀和 NOI 的最长匹配长度。
此外,由于此题时限较宽裕,所以也可以不显式建出自动机而是在转移 g 时直接转移 f。
(这样就要按照状压的方式来存储结点)
然后这其实就是 DP 套 DP 的名字来源(
代码:
1 |
|