zoukankan      html  css  js  c++  java
  • BZOJ 2789: [Poi2012]Letters( BIT )

    直接求逆序对就行了...时间复杂度O(nlogn)

    -------------------------------------------------------------------------

    #include<bits/stdc++.h>
     
    using namespace std;
     
    #define idx(c) ((c) - 'A')
    #define lowbit(x) ((x) & -(x))
     
    const int charset = 26;
    const int maxn = 1000009;
     
    stack<int> let[charset];
    int N;
    long long ans = 0;
    char A[maxn], B[maxn];
     
    struct BIT {
    int b[maxn];
    BIT() {
    memset(b, 0, sizeof b);
    }
    inline void add(int p) {
    for(++p; p <= N; p += lowbit(p))
       b[p]++;
    }
    inline int sum(int p) {
    int ret = 0;
    for(++p; p; p -= lowbit(p))
       ret += b[p];
    return ret;
    }
    } bit;
     
    int main() {
    cin >> N;
    scanf("%s", A); scanf("%s", B);
    for(int i = 0; i < N; i++)
       let[idx(A[i])].push(i);
    for(int i = N - 1; ~i; i--) {
    int t = let[idx(B[i])].top(); let[idx(B[i])].pop();
    ans += bit.sum(t);
    bit.add(t);
    }
    cout << ans << " ";
    return 0;
    }

    ------------------------------------------------------------------------- 

    2789: [Poi2012]Letters

    Time Limit: 20 Sec  Memory Limit: 128 MB
    Submit: 210  Solved: 144
    [Submit][Status][Discuss]

    Description

    给出两个长度相同且由大写英文字母组成的字符串A、B,保证A和B中每种字母出现的次数相同。

    现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B。


    Input


    第一行一个正整数n (2<=n<=1,000,000),表示字符串的长度。

    第二行和第三行各一个长度为n的字符串,并且只包含大写英文字母。



    Output

    一个非负整数,表示最少的交换次数。

    Sample Input

    3
    ABC
    BCA

    Sample Output

    2

    HINT

     



    ABC -> BAC -> BCA

    Source

  • 相关阅读:
    linq in 查询
    sql数据分组取第一条
    获取mac地址
    计算机网络体系结构分层 (OSI TCP/IP)
    2048游戏代码
    go——变量、类型、常量、函数
    关于装饰器 开放封闭
    linux杂碎知识
    crawl——scrapy(配置文件,持久化,请求传递参数,提高爬虫效率,爬虫中间件,集成selenium,去重规则)
    crawl——xpath使用
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4715182.html
Copyright © 2011-2022 走看看