String Reversal
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的更多相关文章
- Educational Codeforces Round 96 (Rated for Div. 2) E. String Reversal (思维,逆序对)
题意:给你一个字符串,每次可以调换现字符串的相邻两个字符,问最少操作多少次使得这个字符串等于其反转过来的字符串. 题解:先考虑字符串中没有相同字符的情况,那么我们每次将目前字符串的最后一个字符一直调换 ...
- CF1430 E. String Reversal(div 2)
题目链接:http://codeforces.com/contest/1430/problem/E 题意:有一串长度为n(n<=2*10^5)由小写字母组成的字符串,求通过相邻交换得到其反转串( ...
- Educational Codeforces Round 96 (Rated for Div. 2) E. String Reversal 题解(思维+逆序对)
题目链接 题目大意 给你一个长度为n的字符串,可以交换相邻两个元素,使得这个字符串翻转,求最少多少种次数改变 题目思路 如果要求数组排序所需要的冒泡次数,那其实就是逆序对 这个也差不多,但是如果是相同 ...
- ZOJ 1151 Word Reversal反转单词 (string字符串处理)
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=151 For each list of words, output a l ...
- Word Reversal(string)
For each list of words, output a line with each word reversed without changing the order of the word ...
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
随机推荐
- [LeetCode] 448. Find All Numbers Disappeared in an Array 找到数组中消失的数字
题目描述 给定n个数字的数组,里面的值都是1-n,但是有的出现了两遍,因此有的没有出现,求没有出现值这个数组中的值有哪些. 要求不能用额外的空间(除了返回列表之外),时间复杂度n 思路 因为不能用额外 ...
- [opencv]KAZE、AKAZE特征检测、匹配与对象查找
AkAZE是KAZE的加速版 与SIFT,SUFR比较: 1.更加稳定 2.非线性尺度空间 3.AKAZE速度更加快 4.比较新的算法,只有Opencv新的版本才可以用 AKAZE局部匹配介绍 1.A ...
- Java初学者作业——编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字。
返回本章节 返回作业目录 需求说明: 编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字. 实现思路: 定义方法findNums(),用于实现查找所有能够整除指定数 ...
- 编写Java程序,以继承和多态思想模拟饲养员喂养不同动物的不同行为
返回本章节 返回作业目录 需求说明: 以继承和多态思想模拟饲养员喂养不同动物的不同行为 动物园有饲养员和动物,其中动物有老虎.马.猴子.羊.狼等. 饲养员对不同的动物有不同的喂养行为. 实现思路: 以 ...
- 编写Java程序,使用日期处理类实现日期的格式化输出
返回本章节 返回作业目录 需求说明: 按"yyyy-MM-dd"格式输入一个字符串型日期,然后输出这个日期为本年中的第几周. 实现思路: 使用SimpleDateFormat格式化 ...
- git下载
git快速下载地址:https://github.com/waylau/git-for-win
- 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据
初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...
- java同时替换多个字符串
参考资料: https://blog.csdn.net/qq_39390545/article/details/106020221 来自为知笔记(Wiz)
- spring boot 使用 mybatis 开启事务回滚 的总结
1.前言 以前没有使用mybatis,可以关闭自动提交,然后做sql操作,对操作进行catch捕获异常, 如果没有异常则commit 提交 ,有异常则 rollback 回滚,新增的数据则删除 ,修改 ...
- 华为云 Kubernetes 管理员实训 三 课后作业
Exercise 1 通过Deployment方式,使用redis镜像创建一个pod.通过kubectl获得redis启动日志. Deployment的名称为<hwcka-003-1-你的华为云 ...