题目链接:http://codeforces.com/contest/1430/problem/E

题意:有一串长度为n(n<=2*10^5)由小写字母组成的字符串,求通过相邻交换得到其反转串(回文串)得最少交换次数

思路:通过这道题学会了一些奇怪而又实用的小知识(雾,一般相邻交换会想到逆序对数---->一个数列的逆序对数是其通过相邻交换恢复为自然序列的最小交换次数

   因此我们可以将字符串逆序给予编号,这样的话就可以用逆序对数解决问题啦

   但是!!!怎么解决相同的字符?我们已知相同的字符间是等价的,因此如果我们要使交换次数最小,不妨使相同字符的编号从小排到大(使其内部间的逆序对数=0)

   实现方式是枚举a-z,分别得到相同字符的子串,然后反转编号,复杂度为O(26*n+n)   (或者在输入时可以用链表优化,复杂度O(2*n))

   操作完后用树状数组求逆序对数即可

代码:

#include <cstdio>
#define lowbit(x) x&(-x)
#define LL long long
char s[200100];
int n,a[200100],cnt,head[200100],num;
LL ans;
struct BIT{
int tr[200100];
void add(int x)
{
for(;x<=n;x+=lowbit(x)) tr[x]++;
return;
}
LL query(int x)
{
LL sum=0;
for(;x;x-=lowbit(x)) sum+=tr[x];
return sum;
}
}P;
void exch(char x)
{
int t;
num=0;
for(int i=1;i<=n;i++)
if (s[i]==x) head[++num]=i;
for(int i=1;i<=num/2;i++)
{t=a[head[i]]; a[head[i]]=a[head[num-i+1]]; a[head[num-i+1]]=t;}
return;
}
int main()
{
scanf("%d",&n); cnt=1;
scanf(" %s",s+1);
a[n]=cnt;
for(int i=n-1;i>=1;i--)
{
if (s[i]!=s[i+1]) cnt++;
a[i]=cnt;
}
for(int i=0;i<26;i++) exch('a'+i);
for(int i=1;i<=n;i++)
{
ans+=P.query(cnt)-P.query(a[i]);
P.add(a[i]);
}
printf("%lld",ans);
return 0;
}

CF1430 E. String Reversal(div 2)的更多相关文章

  1. CF1430 D. String Deletion(div 2)

    题目链接:http://codeforces.com/contest/1430/problem/D 题意:有一个长度为n(n<=2*10^5)的01字符串,每轮操作有两步: 第一步是删去字符串中 ...

  2. ES6, Angular,React和ABAP中的String Template(字符串模板)

    String Template(字符串模板)在很多编程语言和框架中都支持,是一个很有用的特性.本文将Jerry工作中使用到的String Template的特性做一个总结. ES6 阮一峰老师有一个专 ...

  3. Codeforces Round #581(Div. 2)

    Codeforces Round #581(Div. 2) CF 1204 A. BowWow and the Timetable 题解:发现,$4$的幂次的二进制就是一个$1$后面跟偶数个$0$. ...

  4. 1050 String Subtraction (20 分)

    1050 String Subtraction (20 分) Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be the ...

  5. pat 1050 String Subtraction(20 分)

    1050 String Subtraction(20 分) Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be the ...

  6. 10-2 body标签中相关的标签(字体标签,排版标签(div,span),超链接,图片标签)

    一 排版标签(div,span) 1块级标签 <!--div:把标签中的内容作为一个块儿来对待(division).必须单独占据一行.--> <!--div标签的属性:--> ...

  7. Codeforces Round #617 (Div. 3) String Coloring(E1.E2)

    (easy version): 题目链接:http://codeforces.com/contest/1296/problem/E1 题目一句话就是说,两种颜色不同的字符可以相互换位, 问,对这字符串 ...

  8. 网站常见问题及解决方法(div/css)

    18.<a> 在IE6,7 下面重新定义宽和高的代码:{  display:block; display:-moz-inline-stack; display:inline-block;  ...

  9. LeetCode算法题-Reverse String II(Java实现)

    这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...

随机推荐

  1. CSS 常见样式 特殊用法 贯穿线&徽章&箭头

    ### 贯穿渐变线,中间插值- 如图: > ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190427200554843.png) ![在这里插入图片描述 ...

  2. Sorted Adjacent Differences(CodeForces - 1339B)【思维+贪心】

    B - Sorted Adjacent Differences(CodeForces - 1339B) 题目链接 算法 思维+贪心 时间复杂度O(nlogn) 1.这道题的题意主要就是让你对一个数组进 ...

  3. C++获取运行程序当前目录

    1 HMODULE GetSelfModuleHandle() 2 { 3 MEMORY_BASIC_INFORMATION mbi; 4 return ((::VirtualQuery(GetSel ...

  4. Java源码赏析(五)再识 String 类

    在 Java源码赏析(三)初识 String 类   中,我们已经大概理解了String的接口,接下来我们描述一下String的常用工具方法. /** * 为了精简的String结构,之前提到的方法省 ...

  5. Python练习题 041:Project Euler 013:求和、取前10位数值

    本题来自 Project Euler 第13题:https://projecteuler.net/problem=13 # Project Euler: Problem 13: Large sum # ...

  6. IDEA文本编辑区的护眼绿豆沙色配置

    第一步:打开IDEA -> File -> settings -> Editor -> Color Scheme -> General 第二步:找到右方Text -> ...

  7. 《C++primerplus》第7章练习题

    1.用户不断输入两个数,计算调和平均数,直到其中一个数为0. #include<iostream> using namespace std; double harm_mean(double ...

  8. Charles 模拟弱网

    1.Charles安装方法: 1)在官网下载安装: 2)输入如下注册码破解,Charles 4.2.7 目前版本,可用. Registered Name: https://zhile.io       ...

  9. XML流操作

    /// <summary>         /// 保存XML为指定格式         /// </summary>         /// <param name=& ...

  10. 西安交通大学c++[mooc]课后题12章(只有后两题)

    不是从第一题开始的,因为我刚准备把代码粘到CSDN上面,可以给自己看,也有可能启发后来者. 机会是留给有准备的人的      --路易斯·巴斯德 先写下第12周慕课学习总结吧! 多态就是将运算符重载, ...