CF2069E. A, B, AB and BA

E. A, B, AB and BA

算法

字符串, 构造, 贪心.

思路

Resource.

首先可以发现我们可以从每一个 \(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 时, 如果我们选择用 ABABAB, 那么会剩下两个 AB, 届时我们需要用 A, B 来分别消去, 并不会更优; 但是如果我们选择用 ABAB, BAABAB, 就只会剩下 A, B.

最后在不得已的情况下才用 A / B 来代替.

posted @   Steven1013  阅读(63)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开