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\)

posted @ 2020-10-16 11:13  Pat  阅读(141)  评论(0编辑  收藏  举报