欢迎光临散文网 会员登陆 & 注册

CF竞赛题目讲解_CF1430E(树状数组)

2022-08-06 11:43 作者:Clayton_Zhou  | 我要投稿

//https://codeforces.com/problemset/problem/1430/e


题意

已知一个小写字母字符串A,现有一个A的翻转字符串B,每次可以交换A中两个相邻的字母,问至少交换多少次可以得到字符串B。


思路

设字符串A为aabbc,则字符串B为cbbaa。

贪心考虑,枚举字符串B中的字符,每次优先选择字符串A中最近的相同字符交换过来。

接下来需要维护最近的相同字符的贡献。


1. 首先用26个双端队列,保存26的字母出现的每个位置。对于B串的第一个字符c,在A串中的位置为5,要将字符c交换至第一个位置,

那么字符串A中位置1至4的字符都要后移一位。


2. 前面匹配完成的字符已经不会再产生贡献,因此可以看成该字符被删除,

而单个字符移动所需要的花费就是两个字符之间存在的字符数量。


3. 如果从A串中的最后一个字符开始向前处理,则位置pos的字符贡献,即是位置pos前剩余的字符个数。与位置pos后面的字符没有关系。


可以用树状数组维护。

input

9

icpcsguru


CF竞赛题目讲解_CF1430E(树状数组)的评论 (共 条)

分享到微博请遵守国家法律