Description
Today, as a friendship gift, Bakry gave Badawy nn integers (a_1,a_2,…,a_n) and challenged him to choose an integer (X) such that the value (mathop{max}limits_{1≤i≤n}(ai⊕X)) is minimum possible, where ⊕ denotes the bitwise XOR operation.
As always, Badawy is too lazy, so you decided to help him and find the minimum possible value of (mathop{max}limits_{1≤i≤n}(ai⊕X)).
Input
The first line contains integer (n (1≤n≤10^5)).
The second line contains (n) integers $ a_1,a_2,…,a_n(0≤a_i≤2^{30}−1).$
Output
Print one integer — the minimum possible value of (mathop{max}limits_{1≤i≤n}(ai⊕X))
Examples
input
3
1 2 3
output
2
input
2
1 5
output
4
Note
In the first sample, we can choose (X=3).
In the second sample, we can choose $ X=5$.
题意
给定n个数,求一个数x使得(mathop{max}limits_{1≤i≤n}(ai⊕X))最小,并输出(mathop{max}limits_{1≤i≤n}(ai⊕X))
题解
我们从最高位向低位分治,对于每一位,(O(n))扫一遍所有的数,如果这一位所有数都是1,或者所有数都是零,我们就可以让这一位对答案不产生贡献,否则这一位产生的贡献是不可避免的,我们只需要看后面的数产生的贡献哪个比较小就可以了。这样我们把这一位是1的,和这一位是0的分成两个集合,分别递归下去,取返回值较小的,加上(1 << d)即可。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 50;
vector<int> v;
typedef long long ll;
ll dfs(int d, vector<int> v) {
if (v.size() == 0 || d < 0) return 0;
vector<int> v1, v0;
for (int i = 0; i < v.size(); i++) {
if ((v[i] >> d) & 1) v1.push_back(v[i]);
else v0.push_back(v[i]);
}
if (v0.size() == 0) return dfs(d - 1, v1);
else if (v1.size() == 0) return dfs(d - 1, v0);
else return min(dfs(d - 1, v1), dfs(d - 1, v0)) + (ll)(1 << d);
}
int main() {
int n;
scanf("%d", &n);
int maxx = 0;
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
v.push_back(x);
maxx = max(maxx, x);
}
int cnt = 0;
while (maxx) {
maxx >>= 1;
cnt++;
}
printf("%lld
", dfs(cnt, v));
return 0;
}