题目链接

字典树 + 离散化查询
class Solution {
public:
vector<vector<int>> son;
void add(int x)
{
int p = 0;
for(int i = 30; ~i; --i)
{
int u = x >> i & 1;
if(!son[p][u])
{
son[p][u] = son.size();
son.push_back({0, 0});
}
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 << 1) + !u;
}
else
{
p = son[p][u];
res = (res << 1) + u;
}
}
return res^x;
}
vector<int> maximizeXor(vector<int>& nums, vector<vector<int>>& queries) {
sort(nums.begin(),nums.end());
int n = queries.size();
for(int i = 0; i < n; i++)
queries[i].push_back(i);
sort(queries.begin(),queries.end(),[]
(vector<int>& x, vector<int>& y){
return x[1] < y[1];
});
vector<int>ans(n);
son.push_back({0,0});
int idx = 0;
for(auto& x : queries)
{
int f = x[0], y = x[1], id = x[2];
while(idx < nums.size() && nums[idx] <= y)
add(nums[idx++]);
if(son.size() == 1) ans[id] = -1;
else ans[id] = query(f);
}
return ans;
}
};
这个博客介绍了一种利用字典树(Trie)进行离散化查询的方法,用于高效处理最大异或查询。在给定整数数组和一系列查询区间的情况下,该方法能快速找到每个查询区间内与给定整数的最大异或值。通过预处理数组并按顺序存储,可以优化查询效率,避免不必要的遍历。
5万+

被折叠的 条评论
为什么被折叠?



