CF1701E 题解
EuphoricStar · · 题解
思路
手玩几组数据可知:
-
若不回到开头删字符,则操作次数为
n - pl ,其中pl 表示s 和t 的\mathrm{LCP} 长度。 -
若需要回到开头删字符,则最优解一定是光标先从右往左移动一段,若有不同的字符则按一次
backspace;然后按home回到开头,光标从左往右移动一段,若有不同的字符则需要先按right再按backspace。中间有一段是跟t 中相同长度的一段匹配的,因此不用动。
可以把
转移:
- 任意时刻,若光标在前/后部分,都可以删除当前字符。在前部分删除一个字符的代价是
2 (因为要先按right再按backspace),在后部分删除一个字符的代价是1 。因此:
注意这里没有
- 当
s_i = t_j ,若光标在前/后部分,则直接按right/left,匹配长度增加1 。若光标在中部分,则直接沿用之前的值。因此:
- 任意时刻,光标都可以从前部分转入中部分/后部分,或从中部分转入后部分。因此:
注意最后还要加上按 home 的操作,即操作次数为
由于此题卡空间,所以要用滚动数组优化。
代码
code