1. 程式人生 > 其它 >P3531 [POI2012]LIT-Letters

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;
}