题目链接: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管理——搭建iso镜像私有yum源仓库(1)

    在服务器上一般是没有光驱的,那么我们怎么制作iso本地repo镜像源仓库? 通过本地iso镜像,copy到linux系统中一个目录中,进行伪文件系统挂载,执行如下命令: 挂载:mount -o loo ...

  2. springboot中关于Long类型返回前端精度丢失问题处理

    使用了HuTool这个雪花算法后,会出现丢失精度的问题 hutool算法使用地址 对于一些大的业务表,自增主键这里 接口层得注意下是否会产生大数值 设计接口的时候采用String类型. 在项目中,我们 ...

  3. robotframework获取Token

    公司做接口自动化,但是其他接口调用都需要传入token,所以首要目标是把token读取出来. 需要清楚以下内容: 1.登录使用post请求 2.https协议,且登录后需手工验证SSL证书,默认处于不 ...

  4. 关于button和submit的form提交以及 页面跳转问题

    最近在做官网的注册登录form提交时遇到了这个问题,1.0时因为使用普通的模板并没有出现页面跳转失败问题 由于2.0时更换了注册模板,此时按钮样式是以下样式 而在css样式的模板里使用的是button ...

  5. 动态生成简约MVC请求接口|抛弃一切注解减少重复劳动吧

    背景 目前创建一个后端请求接口给别人提供服务,无论是使用SpringMVC方式注解,还是使用SpringCloud的Feign注解,都是需要填写好@RequestMap.@Controller.@Pa ...

  6. 最全总结 | 聊聊 Python 数据处理全家桶(Memcached篇)

    1. 前言 本篇文章继续继续另外一种比较常用的数据存储方式:Memcached Memcached:一款高性能分布式内存对象缓存系统,通过 内存缓存,以减少数据库的读取,从而分担数据库的压力,进而提高 ...

  7. C面向对象: 升级版本实现:同步逻辑、少量连续失败则增补、多次连续失败则拉长同步周期

    // C语言之 面向对象+虚事务的抽象 /*********** 进阶练习: (对虚的事物的抽象) 完善部门职责 ***********************/ #include <stdio ...

  8. 【题解】Product

    \(\color{brown}{Link}\) \(\text{Solution:}\) \(Question:\) \(\prod_{i=1}^n \prod_{j=1}^n \frac{lcm(i ...

  9. Java 将Html转为PDF(二)

    前面介绍了如何通过插件的方式将Html文件转为PDF,该方法需要使用Spire.PDF for Java 3.6.6或者之后的新版本,可根据自己的系统选择不同插件来实现转换.本文提供另外一种转换方法, ...

  10. ubuntu20 make redis6

    redis 官网:https://redis.io redis 下载和编译位置: cd /opt 下载 redis: wget http://download.redis.io/releases/re ...