2789: [Poi2012]Letters
2017-01-02 12:37
197 查看
2789: [Poi2012]Letters
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 417 Solved: 267
[Submit][Status][Discuss]
Description
给出两个长度相同且由大写英文字母组成的字符串A、B,保证A和B中每种字母出现的次数相同。现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B。
Input
[align=left][/align]第一行一个正整数n (2<=n<=1,000,000),表示字符串的长度。
第二行和第三行各一个长度为n的字符串,并且只包含大写英文字母。
Output
[align=left]一个非负整数,表示最少的交换次数。[/align]Sample Input
3ABC
BCA
Sample Output
2HINT
ABC -> BAC -> BCA
Source
鸣谢 oimaster[Submit][Status][Discuss]
同一种字符不管怎样操作,相对位置肯定不会改变
因此每个字符最终去哪里都是固定的,,求逆序对数就行了
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<vector> #include<queue> #include<set> #include<map> #include<stack> #include<bitset> #include<ext/pb_ds/priority_queue.hpp> using namespace std; const int maxn = 1E6 + 10; typedef long long LL; struct data{ int num,pos; data(){} data(int num,int pos): num(num),pos(pos){} bool operator < (const data &b) const {return num < b.num;} }D[maxn]; int n,tail[26],Num[maxn],c[maxn]; char A[maxn],B[maxn]; LL Ans; vector <int> v[26]; int Sum(int pos) { int ret = 0; for (int i = n; i > 0; i -= i&-i) ret += c[i]; for (int i = pos; i > 0; i -= i&-i) ret -= c[i]; return ret; } void Insert(int pos) { for (int i = pos; i <= n; i += i&-i) ++c[i]; } int main() { #ifdef DMC freopen("DMC.txt","r",stdin); #endif cin >> n; scanf("%s",A + 1); scanf("%s",B + 1); for (int i = 1; i <= n; i++) v[B[i] - 'A'].push_back(i); for (int i = 1; i <= n; i++) { int now = A[i] - 'A'; int num = v[now][tail[now]++]; D[i] = data(num,i); } sort(D + 1,D + n + 1); for (int i = 1; i <= n; i++) Ans += 1LL*Sum(D[i].pos),Insert(D[i].pos); cout << Ans; return 0; }
相关文章推荐
- [bzoj2789][Poi2012]Letters_树状数组
- [bzoj2789] [Poi2012]Letters
- BZOJ 2789 Poi2012 Letters 树状数组
- 【bzoj2789】 [Poi2012]Letters
- [BZOJ2789][Poi2012]Letters(树状数组求逆序对)
- 【BZOJ2789】【树状数组】[Poi2012]Letters 题解
- [BZOJ 2789]POI2012 Letters
- BZOJ2789 : [Poi2012]Letters
- bzoj 2789: [Poi2012]Letters
- 【树状数组】bzoj2789 [Poi2012]Letters
- 2789: [Poi2012]Letters
- 【POI2012】【BZOJ2789】Letters
- bzoj 2789 [Poi2012]Letters 求逆序对
- Bzoj 2789: [Poi2012]Letters 树状数组,逆序对
- BZOJ 2789 Poi 2012 Letters 树状数组 逆序对
- 【BZOJ2789】[Poi2012]Letters 树状数组
- bzoj 2789 [Poi2012]Letters 贪心+逆序对
- 【bzoj2789】[Poi2012]Letters
- 2789: [Poi2012]Letters (树状数组求逆序对数)
- BZOJ 2789: [Poi2012]Letters( BIT )