ACdream 1022

这题我开始看的时候没思路,仔细想了想想到怎么做了,因为n是奇数个,所以0和1的个数一定是不同的

第一次提交的时候没有check验证,不过居然过了,后来大神看了我的代码,就发现我的错了

例如当出现某两个数是10 、 01时候,我的代码会将10、 01 和 00 、11混淆,水过了,现在修改了下,没有问题了

只能说我思路不严密,呜呜,真佩服大神

/************************************************************** 
    Problem: 1022 
    User: yp0408100207 
    Language: C++ 
    Result: Accepted 
    Time:360 ms 
    Memory:3076 kb 
****************************************************************/ 


#include<iostream>
#include <algorithm>
#include <cstdio>
using namespace std;

int a[100001],b[100001];
int aa[100001],bb[100001];
int ans[50],n,t;

bool Get_ans(int MAX)
{
	t=0;//ans[]的长度
	int i,flaga[2],flagb[2];
	while(MAX)
	{
		flaga[0]=flaga[1]=0;
		flagb[0]=flagb[1]=0;
		for (i=1;i<=n;i++)
		{
			flaga[aa[i]%2]++;
			flagb[bb[i]%2]++;
			aa[i]>>=1;
			bb[i]>>=1;
		}
		if(flaga[0]==flagb[0]&&flaga[1]==flagb[1])
			ans[t++]=0; 
		else if(flaga[0]==flagb[1]&&flaga[1]==flagb[0]) 
			ans[t++]=1; 
		else  
			return false; 
		MAX>>=1;
	}
	return true;
}

int Check()
{
	int i,ass=0;//计算结果
	int temp=1;
	for (i=0;i<t;i++)
	{
		ass+=ans[i]*temp;
		temp*=2;
	}
	for (i=1;i<=n;i++) 
		a[i]^=ass; 
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	for(i=1;i<=n;i++)
	{
		if (a[i]!=b[i]) return -1;
	}
	return ass;
}

int main()
{
	int i;
	while(scanf("%d",&n)!=EOF)
	{
		int MAX=-1;
		for (i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			aa[i]=a[i];
			if (a[i]>MAX) MAX=a[i];
		}
		for(i=1;i<=n;i++)
		{
			scanf("%d",&b[i]);
			bb[i]=b[i];
			if (b[i]>MAX) MAX=b[i];
		}
		if(!Get_ans(MAX))
		{
			printf("-1\n");
			continue;
		}
		printf("%d\n",Check());
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值