Compatible Numbers
题意:给出一个数组array,对于数组中的每一个数arr[i],找出array中是否存在一个数t,使得t&arr[i]=0,若有,输出t,没有输出-1,若有多个t,输出任意一个;
思路:对于任意一个数x,假设数的最大范围有N位二进制则有x&(((1<<N)-1)^x)=0;
如左图所示;
那么对于x',将x'中的任意的1去掉后得到的数temp,必有temp&x=0;
所以令dp[i]表示数i的temp中任意一个数;
则对于数x的答案为dp[T^x];(T为全1);
任务就变成了如何在array中找dp[i];
如果i存在array中dp[i]=i;
如果不存在dp[i]=array中存在的i的temp;也就是枚举i中有1的二进制位;
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
set<int> a, b, c;
int arr[maxn];
int dp[(1<<22)];
int main(){
int n;
while(~scanf("%d", &n)){
memset(dp, -1, sizeof(dp));
for(int i=0; i<n; i++){
scanf("%d", &arr[i]);
dp[arr[i]]=arr[i];
}
int tot=(1<<22)-1;
for(int i=0; i<=tot; 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)];
}
}
}
}
for(int i=0; i<n; i++){
printf("%d%c", dp[tot^arr[i]], i==n-1?'\n':' ');
}
}
return 0;
}