這題我開始看的時候沒思路,仔細想了想想到怎麼做了,因為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;
}