leetcode1707 与数组中元素的最大异或值
给定数组nums[n]和查询数组queries[m],其中queries[i]=[xi,mi],第i个查询表示nums[n]中不超过mi的所有元素与xi异或的最大值。
1<=n,m<=1E5; 0<=nums[i],xi,mi<=1E9
分析:01trie+离线。将询问按mi从小到大排序,将nums[n]从小到大排序,每次处理询问前,把不超过mi的数都加入trie,回答询问。注意,查询01trie时要保证trie非空。
// 01-trie模板。。。
struct Query {
int idx, val;
};
class Solution {
public:
vector<int> maximizeXor(vector<int>& nums, vector<vector<int>>& Q) {
int m = Q.size();
std::map<int,std::vector<Query>> qry;
for (int i = 0; i < m; i++) {
qry[Q[i][1]].emplace_back(i, Q[i][0]);
}
std::vector<int> ans(m, -1);
Trie tr;
tr.init(INT_MAX);
int n = nums.size();
std::sort(nums.begin(), nums.end());
int idx = 0;
for (auto &[k,v] : qry) {
while (idx < n && nums[idx] <= k) {
tr.insert(nums[idx]);
idx += 1;
}
if (tr.size() > 0) {
for (auto i : v) {
ans[i.idx] = i.val ^ tr.find(i.val);
}
}
}
return ans;
}
};
浙公网安备 33010602011771号