LeetCode1707. 与数组中元素的最大异或值
- trie树
- 异或和
- 排序
class Solution {
public:
struct Node{
int x, m, k;
bool operator<(const Node& a)const{
return m < a.m;
}
}q[100005];
int son[3200005][2];
int idx = 0;
void insert(int x){
int p = 0;
for(int i = 31; i >= 0; i --){
int u = x >> i &1;
if(!son[p][u]) son[p][u] = ++idx;
p = son[p][u];
}
}
int query(int x){
if(!idx) return -1;
int p = 0, res = 0;
for(int i = 31; i >= 0; i --){
int u = x >> i &1;
if(son[p][!u]) {
res = res*2 + 1;
p = son[p][!u];
}else{
res = res*2;
p = son[p][u];
}
}
return res;
}
vector<int> maximizeXor(vector<int>& nums, vector<vector<int>>& queries) {
//yxc yyds
memset(son, 0, sizeof son);
sort(nums.begin(), nums.end());
int m = nums.size();
int n = queries.size();
for(int i = 0; i < n; i++){
q[i] = {
queries[i][0], queries[i][1], i};
}
sort(q, q+n);
vector<int> res(n);
for(int i = 0, j = 0; i < n; i++){
while(j < m && nums[j] <= q[i].m) {
insert(nums[j++]);
}
res[q[i].k] = query(q[i].x);
}
return res;
}
};