Today, as a friendship gift, Bakry gave Badawy n integers a1,a2,…,an and challenged him to choose an integer X such that the value max1≤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 max1≤i≤n(ai⊕X).
Input
The first line contains integer n (1≤n≤105).
The second line contains n integers a1,a2,…,an (0≤ai≤230−1).
Output
Print one integer — the minimum possible value of max1≤i≤n(ai⊕X).
题意:给定n个数,求数X,使得X与这n个数相异或的最大值最小
我们可以创建一个异或字典树,每条路径只有0或1,从结点1开始创建第29位到第0位,如果只有0或1,则该位不贡献,01都有则要加上1<<num
ac代码
#include<iostream>
using namespace std;
typedef long long ll;
ll ch[1 << 21][2];
ll a;
ll cnt = 1;
void insert(ll x)
{
ll p = 1;
for (ll i = 29; i >= 0; i--)
{
ll pos = (x >> i) & 1;
if (!ch[p][pos])
{
ch[p][pos] = ++cnt;
}
p = ch[p][pos];
}
}
ll solve(ll num, ll pos)
{
if (num == -1)
return 0;
if (ch[pos][0] == 0)
return solve(num - 1, ch[pos][1]);
else if (ch[pos][1] == 0)
return solve(num - 1, ch[pos][0]);
else
return (1 << num) + min(solve(num - 1, ch[pos][0]), solve(num - 1, ch[pos][1]));
}
int main()
{
ll n;
cin >> n;
for (ll i = 1; i <= n; i++)
{
cin >> a;
insert(a);
}
cout << solve(29, 1) << endl;
}