Codeforces Round #820 G. Cut Substrings 题解

题解

这是一道很直接的 DP 题但难点在于知道从哪转移。首先我们找到 ttss 中的所有出现位置并记为 pospos。定义 fif_i 为消除前 ii 次出现所需要的最小次数,且第 ii 个出现是完整消除的(这样可以避免数重),定义 gig_i 为所对应的不同方法的次数。

当考虑第 ii 个出现时,首先找到 ii 左边第一个不与 ii 重叠的出现 jj,也就是说 jj 是最大的使 posi>posj+t1pos_i > pos_j + |t| - 1 成立的数,我们不需要考虑 jjii 之间的位置转移,因为 jjii 之间的操作会使 ii 位置的出现被部分消除。然后我们再找到最左边与 jj 重叠的出现 kk,也就是说 kk 是最小是使 posjposk+t1pos_j \ge pos_k + |t| - 1 成立的数。 kk 左边的出现就不能考虑了因为 jj 出现就无法被消除,所以我们考虑从 kkjj 位置的转移,最终的答案就是所有满足 lastposi+t1last \le pos_i + |t| - 1fif_i 为最小值的 iigig_i 的和,其中 lastlast 为最后一个出现的位置,具体实现详见代码: