water。。。。
很明显我们把相同的字母相对位置弄出来后,前后同一位置的一定是对应的,否则一定不优。
那么问题就变成两两交换将一个位置的数换到另一位置,裸树状数组。。。
老样子,贴代码
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lowbit(x) ( (x)&(-(x)) )
const int Maxn=1000005;
char ch;
int tr[Maxn],a[Maxn],n,i,j;
vector <int> ori[26], tar[26];
void add(int x){
for (int i=x;i<=n;i+=lowbit(i))
tr[i]++;
}
int get(int x){
int ret=0;
for (int i=x;i>0;i-=lowbit(i))
ret+=tr[i];
return ret;
}
int main(){
freopen("lit.in","r",stdin);
freopen("lit.out","w",stdout);
scanf("%d\n",&n);
for (i=1;i<=n;i++){
ch=getchar();
ori[ch-'A'].push_back(i);
}
scanf("\n");
for (i=1;i<=n;i++){
ch=getchar();
tar[ch-'A'].push_back(i);
}
for (i=0;i<26;i++){
int len=ori[i].size();
for (j=0;j<len;j++)
a[ ori[i][j] ] = tar[i][j];
}
long long ans=0;
for (i=1;i<=n;i++){
ans+=(long long)i-1-get(a[i]);
add(a[i]);
}
printf("%I64d\n",ans);
return 0;
}