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;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 目不交睫 手工活不交押金2019免费供料 心肾不交吃什么中成药 两腮无肉不可交 不交物业费会怎么样 社保交满15年三种情况领不到 手工活不交押金2018免费供料 与朋友交而不信乎 千万不要去西交利物浦 大学该不该上课交手机 不交物业费被起诉后果 房子不住需要交物业费吗 毛坯房交房不合格图片 房产证不满2年交多少税 随身wifi要不要交网费 交不起房租就用妻子东凛 单位交社保 归不归为什么和吴勉绝交 咪表停车不交钱会怎样 金融服务费可以不交吗 2018新规六种情况不用交物业费 贷款买车哪些钱不用交 实名制手机号欠费不交后果 2019新规六种情况不用交物业费 2018新规六种情况不用交暖气费 人不知而不愠不亦君子乎解释 不顾一切居筱亦 人不知而不愠不亦君子乎意思 人不知而不愠不亦君子 人不知而不愠不亦君子乎 神秘爹地惹不起陆亦臣萧玖 神秘爹地惹不起陆亦臣 神秘爹地惹不起萧玖陆亦臣 天不变道亦不变 光年男神不好追江亦寒 萧玖陆亦辰巜神秘爹坨惹不起 不亦君子乎上一句 你若不惜我亦不爱 不亦君子乎 萧玫陆亦臣神秘爹地惹不起 纵浪大化中不喜亦不惧