给出两个长度相同且由大写英文字母组成的字符串
A
、
现在每次可以交换
A
中相邻两个字符,求最少需要交换多少次可以使得
求逆序对
每种字母的相对位置一定不会改变,也就是说每种字母在一开始就已经确定了要对应移到哪一位了,这就相当于求序列逆序对数,和火柴排队差不多
这题我还想了10MIN……
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <vector>
#define lowbit(x)((x)&(-x))
#define N 1000000+1
using namespace std;
int a[N];
void updata(int x,int num)
{
while(x<N)
{
a[x]+= num;
x+=lowbit(x);
}
}
int ask(int x)
{
int num = 0;
while(x)
{
num += a[x];
x -= lowbit(x);
}
return num;
}
char str[N];
vector<int> v[27];
int last[27];
int tmp[N];
int main()
{
int n;
cin>>n;
scanf("%s",str+1);
for(int i=1;i<=n;++i)
v[str[i]-'A'].push_back(i);
scanf("%s",str+1);
for(int i=1;i<=n;++i)
{
tmp[i] = v[str[i]-'A'][last[str[i]-'A']];
last[str[i]-'A']++;
}
long long ans = 0;
for(int i=1;i<=n;++i)
{
ans += ask(N-1)-ask(tmp[i]);
updata(tmp[i],1);
}
cout<<ans;
}