P3531 [POI2012]LIT-Letters
阿新 • • 發佈:2021-10-03
很有意思
首先貪心的對每一個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; }