class Solution {
public:
vector<vector<int>> trie;
int ans = 0,tot = 1;
int findMaximumXOR(vector<int>& nums) {
trie.resize(nums.size()*32,vector<int>(2,0));
for(int x:nums){
insert(x);
}
for(int x:nums){
ask(x);
}
return ans;
}
void insert(int x){
int p = 1;
for(int i=30;i>=0;i--){
int id = (x>>i)&1;
if(!trie[p][id]){
trie[p][id] = ++tot;
}
p = trie[p][id];
}
}
void ask(int x){
int sum = 0;
int p = 1;
for(int i=30;i>=0;i--){
int id = (x>>i)&1;
if(trie[p][!id]){
sum = (sum<<1)|1;
p = trie[p][!id];
}else{
sum <<= 1;
p = trie[p][id];
}
}
ans = max(ans,sum);
}
};
換種字典樹的實現方式:
class Solution {
struct Node{
Node* children[2] = {0};
};
Node *root = new Node;
void insert(int x){
Node* p = root;
for(int i=30;i>=0;i--){
int id = (x>>i)&1;
if(!p->children[id]){
p->children[id] = new Node;
}
p = p->children[id];
}
}
int ask(int x){
int sum = 0;
Node* p= root;
for(int i=30;i>=0;i--){
int id = (x>>i)&1;
if(p->children[!id]){
sum = (sum<<1)|1;
p = p->children[!id];
}else{
sum<<=1;
p = p->children[id];
}
}
return sum;
}
public:
int findMaximumXOR(vector<int>& nums) {
int ans = 0;
for(int x:nums){
insert(x);
}
for(int x:nums){
ans = max(ans,ask(x));
}
return ans;
}
};