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$ 的逆序数,有下列结论:

  1. 可以通过交换相邻两物品将 $P_1$ 变成 $P_2$。
  2. 最少的交换次数是 $P_1$ 和 $P_2$ 的逆序数。

本题困难在于 $s$ 中可能有字符出现不止一次。关键的 observation 是,所交换的两相邻字符一定不同。因此若一个字符出现了多次,则在前后两个排列中这些字符的相对顺序不变。这样问题就化为求两个排列的逆序数。

以下标作为 $s$ 中字符的 ID,得到初始排列 $P_1 : 1, 2, dots, n$。进一步可以确定在 $s$ 反转过后每个字符的位置,得到排列 $P_2$。答案就是 $P_1$ 与 $P_2$ 的逆序数。例子:$s= exttt{aaaza}$,$P_1 : 1,2,3,4,5$,$P_2 : 1, 4, 2, 3, 5$,逆序数是 $2$。

原文地址:https://www.cnblogs.com/Patt/p/13825214.html