$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
思路:
1. 异或口诀:同 0 异 1
2. 将数字看成二进制,从前往后依次插入
3. 尽可能选取相异的数字,如果没有就直接选择原来的数字
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n,x,res;
int son[30*N][2],idx;
//插入数字
void insert(int x)
{
int p=0;
for(int i=30;i>=0;i--)
{
int u=x>>i&1;
if(!son[p][u]) son[p][u]=++idx;
p=son[p][u];
}
}
//查询当前数字的最大异或数
int query(int x)
{
int p=0,res=0;
for(int i=30;i>=0;i--)
{
int u=x>>i&1;
if(son[p][!u])
{
p=son[p][!u];
res=res*2+!u;
}
else
{
p=son[p][u];
res=res*2+u;
}
}
return res;
}
int main()
{
cin>>n;
while(n--)
{
cin>>x;
insert(x);
res=max(res,query(x)^x);
}
cout<<res<<endl;
return 0;
}