solution
若 (a& b = 0),设 (c) 为 (a) 中去掉几个 (1)。
则 (c & b = 0)。
直接 (O(n)) 递推就好了。
(f[i | (1 << j)] = f[i])
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
int read() {
int x = 0, f = 1; char c = getchar();
while(c < '0' || c > '9') {if (c == '-') f = -1;c = getchar();}
while(c <= '9' && c >= '0') {x = x * 10 + c - '0';c = getchar();}
return x * f;
}
int f[1 << 23], n, a[MAXN];
int main() {
n = read();
memset(f, -1, sizeof f);
for (int i = 1; i <= n; i++) {
a[i] = read();
f[a[i] ^ ((1 << 23) - 1)] = a[i];
}
for (int i = (1 << 23) - 1; i; i--)
for (int j = 0; j < 23; j++)
if(f[i | (1 << j)] != -1) f[i] = f[i | (1 << j)];
for (int i = 1; i <= n; i++) cout<<f[a[i]]<<" ";
return 0;
}