zoukankan      html  css  js  c++  java
  • 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$。

  • 相关阅读:
    02_5if switch分支与循环语句
    02_4运算符
    02_3程序格式
    Shell脚本调用ftp上传文件
    02_2数据类型转换
    02_1标识符_关键字_数据类型
    01_3Java Application初步
    01_2Java开发环境的下载 安装 配置
    Mac 安装MySQL
    用 Homebrew 带飞你的 Mac
  • 原文地址:https://www.cnblogs.com/Patt/p/13825214.html
Copyright © 2011-2022 走看看