广州市选2013 seat

206 篇文章 0 订阅
5 篇文章 0 订阅

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值