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
来代替.
分类:
题目总结 / 2025. 1~3月
, 题目总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步