题面
思路
似乎有很多大神用类似逆序对的方法 \(O(n\log n)\) 通过了此题,不过此题是有贪心 \(O(n)\) 做法的。
我们可以从结果推导,每一个 A
和 B
都相邻的情况只有两种:AB...AB
和 BA...BA
,以下称这两个结果串为 \(t\),题目给出的串为 \(s\)。
考虑怎样使得其消耗代价最小,首先容易发现,将 A
移动完后,B
自然也就回到它应该在的位置,所以可以只讨论 A
如何移动。
首先粗略贪心一下,如果我要使当前这个 A
产生的代价最小,必然要找 \(t\) 中离它最近的 A
,但是很快我们就能发现这个结论是错误的,\(s=BBAA\) 就是个很简单的例子。
现在我们从左往右看,如果当前 \(t\) 有剩余没匹配上的 A
在这个 \(s_A\) 的下标之前,那么如果用之后的 A
匹配肯定要消耗更多代价。
所以结论显而易见,第 \(i\) 次出现在 \(s\) 中的 A
应该移动到第 \(i\) 次出现在 \(t\) 中的 A
上,计算两种 \(t\) 的答案取最小值就好了。
AC link。