Compatible Numbers

**题目描述:**
Two integers x and y are compatible , if the result of their bitwise "AND" equals zero, that is, a & b  = 0 . For example, numbers 90 (1011010 ) and 36 (100100 ) are compatible, as 1011010 & 100100  = 0  , and numbers 3 (11 ) and 6 (110 ) are not compatible, as 11 & 110  = 10  .

You are given an array of integers a1 ,  a2 , ...,  an . Your task is to find the following for each array element: is this element compatible with some other element from the given array? If the answer to this question is positive, then you also should find any suitable element.

**Input**
The first line contains an integer n ( 1 ≤  n  ≤ 10^6 ) — the number of elements in the given array. The second line contains n space-separated integers a1 ,  a2 , ...,  an ( 1 ≤  ai  ≤ 4·10 ^6 ) — the elements of the given array. The numbers in the array can coincide.

**Output**
Print n integers ans i . If a i isn't compatible with any other element of the given array a1 ,  a2 , ...,  an , then ans i should be equal to -1. Otherwise ans i is any such number, that a i & ans i  = 0 , and also ans i occurs in the array a1 ,  a2 , ...,  an .

**题目大意**
给你n个数字,分别为a1,...,an,输出每个ai对应的x,使得ai^x==0(x是n个数中的任意一个)

**解题思路**
首先,我们知道  0 ^ 1=1, 1 ^ 1=0.对于题目中的每一个数字都小于1<<22.设N=(1<<22)-1,则对于每一个ai,令x=ai^N,x就相当于把ai上的每一个二进制位取反,所以 x ^ ai = 0.并且对于ai来说,去掉ai中任意一个二进制1得到y,有x ^ y=0.具体看代码吧,写不下去了......

**代码**

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
typedef pair<int,int>pii;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=100+5;
const int N=1<<22;
int dp[1<<22];
int a[1000000+5];
int main()
{
    int n;
    scanf("%d",&n);
    memset(dp,-1,sizeof(dp));
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        dp[a[i]]=a[i];
    }
    for(int i=0;i<(1<<22);i++)
    {
        if(dp[i]==-1)
        {
            for(int j=0;j<22;j++)
            {
                if(i&(1<<j)&&dp[i^(1<<j)]!=-1)
                {
                    dp[i]=dp[i^(1<<j)];
                    break;
                }
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        printf("%d ",dp[(N-1)^a[i]]);
    }
    puts(""); 
}

全部评论

相关推荐

吃不饱的肱二头肌很想退休:tnnd 我以为选妹子呢,亏我兴高采烈的冲进来😠
投递快手等公司10个岗位
点赞 评论 收藏
分享
小火柴燃烧吧:接啊,接了之后反手在咸鱼找个大学生搞一下,量大从优
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务