Educational Codeforces Round 96 E. String Reversal
题目大意
给定字符串 \(s\),要通过交换相邻两字符将 \(s\) 反转。求最少交换次数。
数据范围
- \(s\) 由小写英文字母组成
- $ 2 \le |s| \le 200000$
分析
设 \(P_1\) 是 \(n\) 个互异物品的一个排列,\(P_2\) 是这些物品的另一个排列。设 \(a,b\) 是其中两物品,若在 \(P_1\),\(P_2\) 中二者的相对顺序不同,比如在 \(P_1\) 中 \(a\) 排在 \(b\) 之前而在 \(P_2\) 中 \(a\) 排在 \(b\) 之后,则称无序二元组 \((a, b)\) 是一个逆序对。逆序对的总数称为 \(P_1\) 与 \(P_2\) 的逆序数。
关于两个排列 \(P_1, P_2\) 的逆序数,有下述结论:可以通过交换相邻两物品将 \(P_1\) 变成 \(P_2\),最少的交换次数是 \(P_1\) 和 \(P_2\) 的逆序数。
本题困难在于 \(s\) 中可能有字符出现不止一次。关键的 observation 是,所交换的两相邻字符一定不同。因此若一个字符出现了多次,则在前后两个排列中这些字符的相对顺序不变。这样问题就化为求两个排列的逆序数。
以下标作为 \(s\) 中字符的 ID,得到初始排列 \(P_1 : 1, 2, \dots, n\)。进一步可以确定在 \(s\) 反转过后每个字符的位置,得到排列 \(P_2\)。答案就是 \(P_1\) 与 \(P_2\) 的逆序数。例子:\(s=\texttt{aaaza}\),\(P_1 : 1,2,3,4,5\),\(P_2 : 1, 4, 2, 3, 5\),逆序数是 \(2\)。