Educational Codeforces Round 96 (Rated for Div. 2) - E. String Reversal

跳转链接

题目描述

定义一个操作为交换字符串中相邻的两个字母

给定一个只含有小写字母的字符串 求出从原字符串到翻转之后的字符串需要多少次操作

输入

5
aaaza

输出

2

node

在第一个示例中,您必须交换第三个和第四个元素,因此字符串变为"aazaa"。
然后你必须交换第二个和第三个元素,所以字符串变成了"azaaa"。 因此,可以在两次交换中反转字符串。

分析

我们可以发现每次交换相邻的两个字符 这很像冒泡排序 (冒泡排序中最少的交换次数为 逆序对数

因此这道题就是让我们求逆序对数了,然而这道题有相同的字符出现的可能,就造成了有一些细节问题需要

处理

  • 对于样例aaaza 我们可以把这个字符串等效为12345 然而逆序的如果是54321 这样显然是不对的, 因为我们相同

    的字符在移动的时候肯定是最靠近的去移动,而不是最远的去移动 因此这个逆序应该是14235 这样显然就会有最小的

    操作次数了.
  • 简单来说就是对于逆序的字符串来说, 某个字符从左到右的数字应该是从小到大排序的 比如样例的逆序为azaaa 显然我们

    最左边的那个a 应该是我们所有a所代表的数字中的最小的 因此就是1 后面同理 (这样可以在满足题意的情况下最优

    因此呢这道题就变成了一道求逆序对的题 我们可以用树状数组求解.

这里简单讲一下如何用树状数组求逆序对

  • 我们把一个数组翻转之后, 我们每次查询这个数字之前的数字出现了多少次 就是原数组中以这个数字开头的逆序对数
  • 我们倒序循环原来的数组, 每次求a[i]的前n项和, 然后在树状数组中的这个下标+1 即可

    分享两道树状数组的例题
  • Acwing 楼兰图腾
  • 洛谷 逆序对

本题的代码

AC_CODE

#include <iostream>
#include <cstdio>
#include <vector>
#define pb push_back
#define lowbit(i) i & -i using namespace std; const int N = 2e5 + 10; int n;
int tr[N];
long long ans;
vector<int> a[26], id(26); void add(int x, int c) {
for(int i = x; i <= n; i += lowbit(i))
tr[i] += c;
} int sum(int x) {
int res = 0;
for(int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
}
int main() {
cin >> n;
string s; cin >> s;
for(int i = 0; i < n; i ++ ) a[s[i] - 'a'].pb(i + 1);
for(int i = 0; i < n; i ++ ) {
int p = s[i] - 'a';
ans += sum(a[p].back());
add(a[p].back(), 1);
a[p].pop_back();
}
cout << ans << endl;
}

String Reversal的更多相关文章

  1. Educational Codeforces Round 96 (Rated for Div. 2) E. String Reversal (思维,逆序对)

    题意:给你一个字符串,每次可以调换现字符串的相邻两个字符,问最少操作多少次使得这个字符串等于其反转过来的字符串. 题解:先考虑字符串中没有相同字符的情况,那么我们每次将目前字符串的最后一个字符一直调换 ...

  2. CF1430 E. String Reversal(div 2)

    题目链接:http://codeforces.com/contest/1430/problem/E 题意:有一串长度为n(n<=2*10^5)由小写字母组成的字符串,求通过相邻交换得到其反转串( ...

  3. Educational Codeforces Round 96 (Rated for Div. 2) E. String Reversal 题解(思维+逆序对)

    题目链接 题目大意 给你一个长度为n的字符串,可以交换相邻两个元素,使得这个字符串翻转,求最少多少种次数改变 题目思路 如果要求数组排序所需要的冒泡次数,那其实就是逆序对 这个也差不多,但是如果是相同 ...

  4. ZOJ 1151 Word Reversal反转单词 (string字符串处理)

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=151 For each list of words, output a l ...

  5. Word Reversal(string)

    For each list of words, output a line with each word reversed without changing the order of the word ...

  6. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  7. JavaScript String对象

    本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...

  8. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  9. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

随机推荐

  1. [LeetCode] 448. Find All Numbers Disappeared in an Array 找到数组中消失的数字

    题目描述 给定n个数字的数组,里面的值都是1-n,但是有的出现了两遍,因此有的没有出现,求没有出现值这个数组中的值有哪些. 要求不能用额外的空间(除了返回列表之外),时间复杂度n 思路 因为不能用额外 ...

  2. [opencv]KAZE、AKAZE特征检测、匹配与对象查找

    AkAZE是KAZE的加速版 与SIFT,SUFR比较: 1.更加稳定 2.非线性尺度空间 3.AKAZE速度更加快 4.比较新的算法,只有Opencv新的版本才可以用 AKAZE局部匹配介绍 1.A ...

  3. Java初学者作业——编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字。

    返回本章节 返回作业目录 需求说明: 编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字. 实现思路: 定义方法findNums(),用于实现查找所有能够整除指定数 ...

  4. 编写Java程序,以继承和多态思想模拟饲养员喂养不同动物的不同行为

    返回本章节 返回作业目录 需求说明: 以继承和多态思想模拟饲养员喂养不同动物的不同行为 动物园有饲养员和动物,其中动物有老虎.马.猴子.羊.狼等. 饲养员对不同的动物有不同的喂养行为. 实现思路: 以 ...

  5. 编写Java程序,使用日期处理类实现日期的格式化输出

    返回本章节 返回作业目录 需求说明: 按"yyyy-MM-dd"格式输入一个字符串型日期,然后输出这个日期为本年中的第几周. 实现思路: 使用SimpleDateFormat格式化 ...

  6. git下载

    git快速下载地址:https://github.com/waylau/git-for-win

  7. 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据

    初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...

  8. java同时替换多个字符串

    参考资料: https://blog.csdn.net/qq_39390545/article/details/106020221 来自为知笔记(Wiz)

  9. spring boot 使用 mybatis 开启事务回滚 的总结

    1.前言 以前没有使用mybatis,可以关闭自动提交,然后做sql操作,对操作进行catch捕获异常, 如果没有异常则commit 提交 ,有异常则 rollback 回滚,新增的数据则删除 ,修改 ...

  10. 华为云 Kubernetes 管理员实训 三 课后作业

    Exercise 1 通过Deployment方式,使用redis镜像创建一个pod.通过kubectl获得redis启动日志. Deployment的名称为<hwcka-003-1-你的华为云 ...