ACdream 1022
这题我开始看的时候没思路,仔细想了想想到怎么做了,因为n是奇数个,所以0和1的个数一定是不同的第一次提交的时候没有check验证,不过居然过了,后来大神看了我的代码,就发现我的错了
例如当出现某两个数是10 、 01时候,我的代码会将10、 01 和 00 、11混淆,水过了,现在修改了下,没有问题了
只能说我思路不严密,呜呜,真佩服大神
[cpp]
/**************************************************************
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;
}
补充:软件开发 , C++ ,