题目
解释
- 异或运算 两二进制位相同是0 不相同是1
- 1101 0111 1010
- 暴力做法是,固定一个指针i,再遍历指针j,时间复杂度为o(N)
- 优化做法为,只用一个指针i遍历数组,并将数组元素预处理进字典树
- 每次都进入字典树里采用贪心思想,寻找使得位运算结果尽可能大的数
- 保存下最大的结果
- M的求法是用数据范围1e5*(一共有的位数)31
代码段
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10,M=3100010;
int n;
int son[M][2],idx;
//第一维用来存放31位*1e5个内容
int a[N];
void insert(int x)
{
int p=0;
for(int i=30;i>=0;i--)
{
int &s=son[p][x>>i&1];
if(!s)s=++idx;
//创建一个新节点
p=s;
//p的坐标相当于当前节点的顺序
}
}
int search(int x)
{
int res=0,p=0;
for(int i=30;i>=0;i--)
{
int s=x>>i&1;
if(son[p][!s])
{
res+=1<<i;
p=son[p][!s];
}
else p=son[p][s];
}
return res;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
insert(a[i]);
}
int res=0;
for(int i=0;i<n;i++)
{
res=max(res,search(a[i]));
}
cout<<res<<endl;
}