题目链接;点击打开链接
题意:数列找a&b=0
题解: 对于范围内的数1–(1<<22)-1用DP预处理:
1.先求反
2.1—->0 is possible
解释下2的意思:如果a&111==0那么a&110必定也等于0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 1000006
int n;
int dp[(1<<22)+100];
int a[maxn*10];
int main()
{
int len=(1<<22)-1;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof dp);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
dp[len^a[i]]=a[i];//对a取反
}
for(int i=5*maxn;i>=1;i--)
{
if(!dp[i])
for(int j=0;j<=21;j++)
{
if(dp[i|(1<<j)])
{
dp[i]=dp[i|(1<<j)];
break;
}
}
}
for(int i=0;i<n;i++)
{
if(dp[a[i]])
printf("%d%c",dp[a[i]],i==n-1?'\n':' ');
else
printf("-1%c",i==n-1?'\n':' ');
}
}
return 0;
}