P3531 [POI2012]LIT-Letters

Jennie

很有意思

首先贪心的对每一个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;
}
   

原文地址:https://www.cnblogs.com/For-Miku/p/15363962.html