题意:
给你一些数,问你每个数在这个数组中是否有存在一个数使得他们的与为0
题解:
依旧是SOSDP,这次的高维前缀和记录的是存在的状态
#include<bits/stdc++.h>
using namespace std;
const int N=(1<<22);
int dp[N],a[N];
int main()
{
int n,x;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),dp[a[i]]=a[i];
for(int i=0;i<22;i++)
for(int j=0;j<N;j++)
if(j&(1<<i)&&!dp[j])
dp[j]=dp[j^(1<<i)];
for(int i=1;i<=n;i++)
{
int s=N-1-a[i];
printf("%d%c",dp[s]?dp[s]:-1," \n"[i==n]);
}
return 0;
}