题解 CF2111E Changing the String
模拟赛考到,好像场上写出了线性做法?
Solution
要使最终串的字典序最小,肯定要从第一位贪心地来看。对于当前位,有如下情况:
-
a:不用管。 -
b:有两种修改方法,分别是 \(b\to a\) 和 \(b\to c\to a\),思考哪一种更优,如果我们在可以选择的情况下使用了一个 \(b\to c\to a\),则有可能会破坏后面的一个c的 \(c\to a\),而选择 \(b\to a\) 虽然有可能破坏一个 \(c\to b\to c\),但是仍然会留下至少一个 \(c\to b\),可以让后面的c有机会变得更优,故应该优先选择 \(b\to a\)。 -
c:同理,优先考虑变成a,先后贪心尝试 \(c\to a\),\(c\to b\to a\),\(c\to b\)。
至于怎么计算每种配对,我用的是类似括号匹配的方式,匹配一组 \(b\to c\to a\) 和 \(c\to b\to a\),剩下的或者被拆掉的也加入匹配。
时间复杂度 \(O(n+q)\)。
Code
Link.

浙公网安备 33010602011771号