本题是核心是求逆序对,但是题目的序列是字符串,因此可以用map+归并排序求解。
将字符串用map维护然后再通过读入第二组字符串将pos[i]更新为原本字符串对应的下标,再通过归并排序求解逆序对。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
ll sum = 0;
int pos[N],tmp[N];
void ms(int l,int r)
{
if(l >= r) return ;
int mid = (l + r) >> 1;
ms(l,mid);
ms(mid + 1,r);
int k= 0, i = l,j = mid + 1;
while(i <= mid && j <= r)
{
if(pos[i] <= pos[j])
tmp[k ++] = pos [i ++];
else
{
sum += (mid - i + 1);
tmp[k ++] = pos [j ++];
}
}
while(i <= mid) tmp[k ++] = pos [i ++];
while(j <= r) tmp[k ++] = pos [j ++];
for(int i = l,j = 0; i <= r; i ++,j ++) pos[i] = tmp[j];
}
void run()
{
unordered_map<string,int> mp;
int n;
cin >> n;
for(int i = 0; i < n; i ++)
{
string a;
cin >> a;
mp[a] = i;
}
for(int i = 0; i < n; i++)
{
string a;
cin >> a;
pos[i] = mp[a];
}
ms(0,n - 1);
cout << sum << endl;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
run();
return 0;
}