https://leetcode-cn.com/problems/maximum-xor-with-an-element-from-array/
思路:01字典树,只不过多了一个最大值限制。那么在字典树的每个节点中记录一下到当前位置的最小值,如果该最小值满足限制,那么就可以走到该节点,否则不行。
class Tire{
public:
vector<Tire*> child;
int min_value;
Tire():min_value(0x3f3f3f3f)
{
child.resize(2,nullptr);
}
void insert(int val)
{
int bin_value=1<<30;
min_value=min(min_value,val);
Tire *cur=this;
while(bin_value)
{
int idx=min(1,val&bin_value);
if(cur->child[idx]==nullptr)
cur->child[idx]=new Tire();
cur=cur->child[idx];
cur->min_value=min(cur->min_value,val);
bin_value>>=1;
}
}
int query(int val,int limit)
{
int bin_value=1<<30;
int ans=0;
Tire *cur=this;
if(cur->min_value>limit)
return -1;
while(cur)
{
int idx=min(1,val&bin_value);
if(cur->child[1-idx]&&cur->child[1-idx]->min_value<=limit)
{
ans|=bin_value;
cur=cur->child[1-idx];
}
else
cur=cur->child[idx];
bin_value>>=1;
}
return ans;
}
};
class Solution {
public:
vector<int> maximizeXor(vector<int>& nums, vector<vector<int>>& queries) {
Tire root;
for(const int& num:nums)
root.insert(num);
vector<int> ans;
for(const vector<int>& pr:queries)
ans.push_back(root.query(pr[0],pr[1]));
return ans;
}
};