题目链接: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. yum管理——ningx部署私有repo源(4)

    一.前言: 为了加快安装效率,或者日后服务器处于内网环境,本次特写一片搭建的是一个属于个人私有repo源仓库,思路如下: 1.首先到mirrors.ustc.edu.cn下载用到的源的仓库 2.然后安 ...

  2. Cobalt Strike后渗透安装和初步使用

    Cobalt Strike安装 系统要求 Cobalt Strike要求Java 1.8,Oracle Java ,或OpenJDK . 如果你的系统上装有防病毒产品,请确保在安装 Cobalt St ...

  3. 1000000 / 60S 的 RocketMQ 不停机,扩容,平滑升级!

    一.背景 1.各业务系统持续迭代过程中,JDK.SpringBoot.RocketMQ Client 等框架也进行了升级,高版本的 RocketMQ Client 发送的消息到低版本中,在控制台中午无 ...

  4. 1.10HDFS 回收站机制

  5. PYG2010-01-软件破解意义和程序流程简介笔记

  6. 论文阅读 SNAPSHOT ENSEMBLES

    引入 1. 随机梯度下降的特点 随机梯度下降法(Stochastic Gradient Descent)作为深度学习中主流使用的最优化方法, 有以下的优点: 躲避和逃离假的鞍点和局部极小点的能力 这篇 ...

  7. 使用kind搭建kubernetes

    使用kind搭建kubernetes 目录 使用kind搭建kubernetes kind架构 创建集群 将镜像加载到kind的node中 配置kind集群 配置多节点 多控制面 指定Kubernet ...

  8. Centos-切换用户身份-su

    su 切换用户身份 相关选项 - 加载相应用户下环境变量 -c   使用某个身份执行一个指令 -m  改变用户身份不改变环境变量 切换为超级用户 su - 普通用户切换为超级用户需要输入密码,超级用户 ...

  9. Dynamically allocated memory 动态分配内存【malloc】Memory leaks 内存泄漏

    内存泄露Memory leaks :没有指针指向原来a分配出来的那段空间了

  10. 常见加密算法的 JS 实现

    前言 为破解前端加密做准备,先了解一些常见的加密算法 分类 对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. DES DES ...