Description
你和你的伙伴正在筹备村里的万人宴,由于村子是长条形的,所有宾客将坐在一张超级长桌的一侧就餐。
正当筹备工作进行得火热朝天,你和你的伙伴发现一个严重问题:由于缺乏沟通,你俩各自制作了一张座位图发给各位宾客。你必须计算出有多少对宾客,他们在两份座位图中次序安排是不同的。
例如,对以下两份座位图:
A B C D E
B A D E C
有三对宾客(A,B),(C,D)和(C,E),他们在两份座位图中的次序不同。
Input
输入的第一行是一个整数N(1<=N<=100000),代表宾客的数量。接下来的两行分别代表两张座位图。每行由N个空格分隔的字符串组成,这些字符串代表宾客,宾客名互不相同,只包含字母,长度不超过5个字符。两张座位图上的宾客名单保证是一致的。
Output
输出一个整数,代表有多少对宾客被两份座位图安排了不同的次序。
Sample Input
输入1:
3
Frank Sam Billy
Sam Frank Billy
输入2:
5
A B C D E
B A D E C
Sample Output
输出1:
1
输出2:
3
Data Constraint
1<=N<=100000
.
.
.
.
.
分析
逆序对+哈希字符串处理
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
int mo=6317,b[100010],n,y[100100];
string s;
long long ans;
map<string,int>h;
void nxd(int *a,int l,int r)
{
if (l>=r) return;
int mid=(l+r)/2;
nxd(a,l,mid);
nxd(a,mid+1,r);
int head=l,tail=mid+1,i=l;
while (head<=mid&&tail<=r)
{
if (a[head]<=a[tail])
{
b[i]=a[head];
i++;
head++;
} else
{
b[i]=a[tail];
i++;
tail++;
ans+=mid-head+1;
}
}
while (head<=mid)
{
b[i]=a[head];
i++;
head++;
}
while (tail<=r)
{
b[i]=a[tail];
i++;
tail++;
}
for (int i=l;i<=r;i++)
a[i]=b[i];
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
cin>>s;
h[s]=i;
}
for (int i=1;i<=n;i++)
{
cin>>s;
y[i]=h[s];
}
nxd(y,1,n);
printf("%lld",ans);
return 0;
}