chenfy27的刷题记录

导航

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;
    }
};

posted on 2024-12-29 15:29  chenfy27  阅读(5)  评论(0)    收藏  举报