Dr. Evil Underscores
对于第i
位,如果数组中所有的数都是1
或者0
,那么我们通过选择可以使异或的结果为0
;
如果既有1
也有0
,异或的结果的i
位一定是1
,但是我们可以选择置1
或者0
的一个最小值。
#include <iostream>
#include <vector>
using namespace std;
vector<int> a;
int solve(vector<int>& c, int bit) {
if (c.size() == 0 || bit < 0) return 0;
vector<int> l, r;
for (auto& i : c) {
if (((i >> bit) & 1) == 0)
l.push_back(i);
else
r.push_back(i);
}
if (l.size() == 0) return solve(r, bit - 1);
if (r.size() == 0) return solve(l, bit - 1);
return min(solve(l, bit - 1), solve(r, bit - 1)) + (1 << bit);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
a.resize(n);
for (auto& i : a) cin >> i;
cout << solve(a, 30) << endl;
return 0;
}
最后更新于
这有帮助吗?