这道题主要是:
1.把每一个数都要分解成31位的二进制
2.把所有数插入tire树中
3.遍历所有值,找到每一个值的最优解。
4. 遍历c[i] 时, 通过判断该路每一个位置有没有不同值来确定使用哪条路
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N=5e5+10;
int c[N];
int st[N*31][2];//trie数 把一个数分解成31位那么数组范围要扩大
int idx;//储存每个节点的唯一坐标
int ans=0;
void insert(int c)
{
int p=0;
for(int i=30;~i;i--)//从最高位开始记录
{
int x;
x=c>>i&1;//求i位的二进制数
if(!st[p][x]) st[p][x]=++idx;
p=st[p][x];
}
}
int query(int c)
{
int p=0;
for(int i=30;~i;i--)//高位遍历
{
int x;
x=c>>i&1;
if(st[p][!x]) //如果同一根节点存在相反的数,那就取那条路
{
ans=ans*2+1;//如果存在的话 ,那么那一位异或值必为1否则为0
p=st[p][!x];
}
else
{
ans=ans*2;
p=st[p][x];//否则走原路
}
}
return ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>c[i];
insert(c[i]);//插入所有
}
int ma=0;
for(int i=1;i<=n;i++)
{
ans=0;
ma=max(query(c[i]),ma);//遍历所有数,找到所有数异或的最优解
}
cout<<ma;
}