bzoj 2789: [Poi2012]Letters 树状数组求逆序对
来源:互联网 发布:腾讯数据分析师面经 编辑:程序博客网 时间:2024/05/16 20:29
题意
给出两个长度相同且由大写英文字母组成的字符串A、B,保证A和B中每种字母出现的次数相同。
现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B。
n<=1000000
分析
贪心的想,显然每个字符会移到离它最近的相同的字符处那么我们只要把对应的位置序列求出来,然后用树状数组求个逆序对就好了。
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int N=1000005;int n,next[N],last[N],a[N],c[N];char s1[N],s2[N];void ins(int x){ while (x<=n) { c[x]++; x+=x&(-x); }}int find(int x){ int ans=0; while (x) { ans+=c[x]; x-=x&(-x); } return ans;}int main(){ scanf("%d",&n); scanf("%s",s1+1); scanf("%s",s2+1); for (int i=1;i<=n;i++) { int x=s2[i]-'A'; next[i]=last[x];last[x]=i; } for (int i=n;i>=1;i--) { int x=s1[i]-'A'; a[i]=last[x];last[x]=next[last[x]]; } LL ans=0; for (int i=1;i<=n;i++) ans+=find(n)-find(a[i]),ins(a[i]); printf("%lld",ans); return 0;}
阅读全文
0 0
- bzoj 2789: [Poi2012]Letters 树状数组求逆序对
- bzoj 2789 [Poi2012]Letters 求逆序对
- [BZOJ2789][Poi2012]Letters(树状数组求逆序对)
- 树状数组求逆序对-洛谷P3531 [POI2012]LIT-Letters
- BZOJ 2789 Poi2012 Letters 树状数组
- bzoj 2789 [Poi2012]Letters 树状数组
- BZOJ 2789 Poi 2012 Letters 树状数组 逆序对
- 【BZOJ】【P2789】【Poi2012】【Letters】【题解】【逆序对】
- BZOJ 2789: [Poi2012]Letters
- [BZOJ 2789]POI2012 Letters
- bzoj 2789: [Poi2012]Letters
- BZOJ 2789: [Poi2012]Letters
- 【BZOJ2789】【树状数组】[Poi2012]Letters 题解
- 树状数组求逆序对
- 树状数组求逆序对
- 树状数组求逆序对
- 树状数组求逆序对
- 树状数组求逆序对
- Android开发中那些常见到让人忽视的基础知识
- gradle命令报错Unsupported major.minor version 52.0的解决办法
- 机器学习-从kNN开始
- STATA字符型数据按符号截取和转换
- Android中的SystemClock
- bzoj 2789: [Poi2012]Letters 树状数组求逆序对
- spring-ehcahe
- [opencv]利用每帧图像减去第一帧无人的图像来检测视频人数
- 机器学习— 获取数据,绘制图表
- 利用Guetzli批量压缩图片
- Java中的synchronized
- 机器学习-kNN实现简单的手写数字识别系统
- phpcms v9的表单向导实现问答咨询功能的方法
- Handler简单分析-runOnUiThread,view.post()