您的位置:首页 > 其它

acdream 1023 xor按位思考

2015-08-01 20:09 295 查看
思路:记答案为ans,统计出数列A和B在某二进制某一位上有多少个1,如果个数相同,则ans那一位上为0(因为题目要求最小的满足条件的值),如果不一样(则需要考虑那一位上异或个1),则判断数列A在那一位上0的个数是否等于数列B那一位上1的个数,不等于则无解,否则,那一位上set为1,继续判断。

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

const int N = 31;
int cnt1
;
int cnt2
;

void decompose( int num, int * a )
{
int p = 0;
while ( num )
{
p++;
if ( num & 1 )
{
a[p]++;
}
num >>= 1;
}
}

int main ()
{
int n, tmp;
while ( scanf("%d", &n) != EOF )
{
memset( cnt1, 0, sizeof(cnt1) );
for ( int i = 0; i < n; i++ )
{
scanf("%d", &tmp);
decompose( tmp, cnt1 );
}
memset( cnt2, 0, sizeof(cnt2) );
for ( int i = 0; i < n; i++ )
{
scanf("%d", &tmp);
decompose( tmp, cnt2 );
}
int ans = 0;
bool flag = true;
for ( int i = 1; i < N; i++ )
{
if ( cnt1[i] == cnt2[i] ) continue;
if ( cnt1[i] + cnt2[i] == n )
{
ans += ( 1 << ( i - 1 ) );
}
else
{
flag = false;
break;
}
}
if ( !flag )
{
ans = -1;
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: