很有意思
首先贪心的对每一个a中字符匹配B中出现的第一个对应未匹配字符,这样的话就有了顺序
然后每一次的操作是交换相邻的字符,很像某种求逆序对方式对不对
然后这个题就是求逆序对
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#define int long long
using namespace std;
int n;
char s1[5000001],s2[5000001];
queue<int> q[27];
int tr[5000005];
struct p{
int id;
int v;
}po[2000005];
int lowbit(int x){
return x&(-x);
}
void add(int x,int v){
for(int i=x;i<=n+1;i+=lowbit(i)){
tr[i]+=v;
}
}
int qur(int x){
// cout<<x<<endl;
int ans=0;
while(x){
ans+=tr[x];
x-=lowbit(x);
}
return ans;
}
int re[1000001];
int an;
bool cmp(p x,p y){
return x.v>y.v;
}
signed main(){
cin>>n;
n+=2;
for(int i=3;i<=n;++i){
cin>>s1[i];
q[s1[i]-'A'].push(i);
//cout<<i<<endl;
}
for(int i=3;i<=n;++i){
cin>>s2[i];
po[i].v=q[s2[i]-'A'].front();
po[i].id=i;
q[s2[i]-'A'].pop();
}
sort(po+3,po+n+1,cmp);
for(int i=3;i<=n;++i){
// cout<<re[i]<<endl;
add(po[i].id,1);
an+=qur(po[i].id-1);
// cout<<x<<endl;
}
cout<<an;
return 0;
}