zoukankan      html  css  js  c++  java
  • [bzoj2789][Poi2012]Letters_树状数组

    Letters bzoj-2789 Poi-2012

    题目大意:给定两个字符串A和B,每次交换A中相邻两个数。问至少交换多少次,可以将A变成B。

    注释:$2le nle 10^6$

    想法:我们发现,A中任意两个相同字符的相对位置是不会发生改变的,所以我们可以直接求逆序对即可。

    最后,附上丑陋的代码... ...

    #include<iostream>
    #include<cstdio>
    #include<vector>
    using namespace std;
    const int N=1000005;
    vector <int> wz[26];
    int sum[N],ss,n,x,len[26],now;
    char s1[N],s2[N];
    long long ans;
    void add(int i){for (;i<=n;i+=(i&(-i)))sum[i]++;}
    int query(int i){for (ss=0;i;i-=(i&(-i)))ss+=sum[i];return ss;}
    int main (){
    	scanf ("%d%s%s",&n,s1+1,s2+1);
    	for (int i=1;i<=n;++i)wz[s1[i]-'A'].push_back(i);
    	for (int i=1;i<=n;++i){
    		add(now=wz[s2[i]-'A'][len[s2[i]-'A']++]);
    		ans+=i-query(now);
    	}
    	printf ("%lld",ans);
    	return 0;
    }
    

     小结:发现性质,并利用性质转化成已知问题,是一种非常好的解题方法。

  • 相关阅读:
    python day1
    Vue与react的择决
    CommonJS规范
    js面向对象的程序设计
    正则匹配所有的a标签
    js-静态、原型、实例属性
    js中参数不对应问题
    sublime常用快捷键
    JSON.parse()和JSON.stringify()
    setAttribute()
  • 原文地址:https://www.cnblogs.com/ShuraK/p/9308392.html
Copyright © 2011-2022 走看看