5640. 与数组中元素的最大异或值

2020-12-27  本文已影响0人  来到了没有知识的荒原

5640. 与数组中元素的最大异或值

第221场周赛t4
trie树
其中要求<=m的条件,就把nums和queries排序,每次插入的nums[i],都保证<=m。保留下queries中的位置信息pos

typedef pair<int,int> pii;
class Solution {
public:
    int trie[100010 * 32][2],idx;
    void insert(int x){
        int p=0;
        for(int i=30;i>=0;i--){
            // 确定分支
            int u=x>>i&1;
            if(!trie[p][u])trie[p][u]=++idx;
            p=trie[p][u];
        }
    }
    int search(int x){
        int p=0,res=0;
        for(int i=30;i>=0;i--){
            int u=x>>i&1;
            if(trie[p][u^1]){
                p=trie[p][u^1];
                res+=1<<i;
            }else p=trie[p][u];
        }
        return res;
    }
    vector<int> maximizeXor(vector<int>& nums, vector<vector<int>>& q) {
        idx=0;
        memset(trie,0,sizeof trie);

        sort(nums.begin(),nums.end());
        int n=q.size();
        vector<pair<pii,int>>qs(n);
        for(int i=0;i<n;i++){
            // x,m
            qs[i]={{q[i][0],q[i][1]},i};
        }
        sort(qs.begin(),qs.end(),[](pair<pii,int>&a,pair<pii,int>&b){
            return a.first.second<b.first.second;
        });
        int ind=0;
        vector<int>res(n);
        for(int i=0;i<qs.size();i++){
            int x=qs[i].first.first;
            int m=qs[i].first.second;
            int pos=qs[i].second;
            while(ind<nums.size() && nums[ind]<=m){
                insert(nums[ind]);
                ind++;
            }
            int ans;
            if(ind==0) ans=-1;
            else ans=search(x);
            res[pos]=ans;
        }

        return res;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读