数组中两个数的最大异或值
class Trie{
public:
Trie *next[2];
Trie(){memset(next,0,sizeof(next));}
};
class Solution {
Trie *root=new Trie();
public:
int query(int x){
int res=0;
Trie *node = root;
for(int i=30;i>=0;i--){
int u=(x>>i)&1;
if(node->next[!u]){
node=node->next[!u];
res=res*2+!u;
}
else{
node=node->next[u];
res=res*2+u;
}
}
return res;
}
int findMaximumXOR(vector<int>& nums) {
int res=0;
for(int j=0;j<nums.size();j++){
Trie *node=root;
for(int i=30;i>=0;i--){
int u=(nums[j]>>i)&1;
if(!node->next[u]) node->next[u]=new Trie();
node = node->next[u];
}
int t=query(nums[j]);
res=max(res,nums[j]^t);
}
return res;
}
};
最大异或对
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010,M=31*N;
int son[M][2],idx;
int a[N];
int n;
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=2*res + !u;
}
else {
p=son[p][u];
res=res*2 + u;
}
}
return res;
}
int main(){
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int res=0;
for(int i=0;i<n;i++){
insert(a[i]);
int t=query(a[i]);
res=max(res,a[i]^t);
}
cout<<res<<endl;
return 0;
}