CF2069E. A, B, AB and BA
E. A, B, AB and BA
算法
字符串, 构造, 贪心.
思路
首先可以发现我们可以从每一个 \(s_i = s_{i + 1}\) 分开以将字符串分成若干部分来分别处理. 具体来说:
对于
ABBABBABA, 我们可以将其分为AB,BAB,BABA这三段来分别处理.
那么现在原串就被拆分成了 ABAB, BABAB 等类似的形式.
进行分讨:
- 对于奇数长度的子串 \((\)例如
ABABA\()\), 我们可以消去 \(\displaystyle \lfloor \frac{len}{2} \rfloor\) 个AB/BA. - 对于偶数长度的子串 \((\)例如
ABAB\()\), 我们可以消去 \(\displaystyle \frac{len}{2}\) 个AB或者 \(\displaystyle \frac{len}{2} - 1\) 个BA.
这样就会有一个贪心: AB 先用来消 ABAB..., BA 先用来消 BABA.... 结束后如果有剩余那么互相消即可.
还要注意我们在消除剩余项的时候记得将所有串递增排序. 例如我们现在剩下 AB, ABAB 两个子串但是只剩下各 1 次机会消去 AB, BA 时, 如果我们选择用 AB 消 ABAB, 那么会剩下两个 AB, 届时我们需要用 A, B 来分别消去, 并不会更优; 但是如果我们选择用 AB 消 AB, BA 消 ABAB, 就只会剩下 A, B.
最后在不得已的情况下才用 A / B 来代替.

浙公网安备 33010602011771号