一类区间动态规划的优化 - Key Words

上周末 UESTC 校赛初赛,由于养老群里奇怪的爷爷一上来就开写这题还说挺好玩的,就看了下。

这是一个看上去是字符串的字符串题(雾

大致背景

给你一个长度为 200200回文串 SS ,一开始给你一个空串 TT ,你可以选择 TT 的一个位置,加一个特定的串 SS 进去。比如说 SSaba,那么做了两次操作之后, TT 就可能是 aababa

现在给你串 TT ,要你输出所有可能的 SS

第一反应,枚举子串,用区间 DP 判断是否可行。首先 SS 满足

  • 长度能被 TT 的长度整除
  • 是一个回文
  • TT 的一个子串

根据这三点,可以得到一个结论,不同的 SS 的个数最多只有 LL 个,这里 LLTT 的长度。

然后嘛,当时第一反应 DP 状态是这个样子的

dp[l][r]dp[l][r]

表示区间 llrr 是否可行。

这样的状态,转移应该是

dp[l][r]=llrrdp[l][r]dp[l][r] = \bigvee_{\substack{l' \leq l\\r' \geq r}}dp[l'][r']

这里 ll'll 还有 rrrr' 这一段可以构成 SS

对于转移,如果是暴力的话,DP 的复杂度是 O(N4)O(N^4) 的,总体复杂度是 O(N5)O(N^5) ,内存的复杂是 O(N2)O(N^2)

考虑到时间复杂度有点高(嗯,只是一点啦),考虑把把 SS 的信息带到状态中去,我们定义状态

dp[l][r][i]dp[l][r][i]

表示考虑到区间 (l,r)(l, r) ,我们最左边已经匹配完了 SS 的前 ii 个字符的方法是否可行。那么转移就是

dp[l][r][i]=dp[l+1][r][i+1]rr(dp[l][r][0]dp[r+k][r][0])dp[l][r][i] = dp[l + 1][r][i + 1] \lor \bigvee_{r' \geq r}\left(dp[l][r'][0] \land dp[r' + k][r][0]\right)

其中,要么匹配 SS 的当前位,要么把 SS 剩下的用右边匹配掉,这里 kkSS 剩下的长度,这样转移复杂度是 O(N)O(N) 的,总体复杂度是 O(N3)O(N^3)

这样总体复杂还算可以了(不过会 T 的吧大概,我猜的(。

回忆下 LCIS 的 DP,其实我们可以不需要枚举右边那段的位置,而让 DP 回来之后继续做 (r,r+k)(r', r' + k) 区间的匹配。定义状态

dp[i][j][k]dp[i][j][k]

表示我们还要匹配 iiSS 串,现在在 TT 的第 jj 位,在 SS 的第 kk 位,这个状态是否可行。注意我们有一个很强的条件,就是第一维和第三维的大小之积正好是 NN 。也就是说,这个状态是 O(N2)O(N^2) 的。

这样,对于转移我们可以在 O(1)O(1) 时间内处理

dp[i][j][k]=dp[i][j1][k1]p(dp[k][j][0]dp[i][j+p×l][k])dp[i][j][k] = dp[i][j - 1][k - 1] \lor \bigvee_{p}\left({dp[k][j][0] \land dp[i][j + p \times l][k]}\right)

其中 llSS 的长度, pp 是枚举的中间自匹配了多少个 SS ,总体的转移是 O(Ll)O(\frac{L}{l}) 的。

这样的话,整个 DP 的复杂度是 O(N2×Ll)O(N^2 \times \frac{L}{l}) 的,总体复杂度会小于 O(N4)O(N^4) ?(根本不想分析复杂度。。。