Anu Has a Function
思路:
\(f(x, y) = x | y - y\)。将 \(x, y\) 对齐。那么结果就是:如果 \(y\) 的第 \(i\) 是 \(1\),那么把 \(x\) 的第 \(i\) 位变为 \(0\)(无论之前是什么)。那么根据这个性质可以发现,改变的都是第 \(1\) 个数,后面其他数的顺序无影响。那么我们先预处理出每个位置上 \(1\) 的个数,然后枚举第一个数即可。
代码:
int n; cin >> n;
vector<int> a(n + 1), cnt1(32);
int idx, val = -1;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++){
for(int j = 0; j < 32; j ++) if((a[i] >> j) & 1) cnt1[j] ++;
}
for(int i = 1; i <= n; i ++){
int tmp = 0;
for(int j = 0; j < 32; j ++)
if(((a[i] >> j) & 1) && cnt1[j] == 1)
tmp += (1 << j);
if(tmp > val){
val = tmp;
idx = i;
}
}
cout << a[idx] << " ";
for(int i = 1; i <= n; i ++) if(i != idx) cout << a[i] << " ";
puts("");