美文网首页
5640. 与数组中元素的最大异或值

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

作者: 来到了没有知识的荒原 | 来源:发表于2020-12-27 16:42 被阅读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;
    }
};

相关文章

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

    5640. 与数组中元素的最大异或值[https://leetcode-cn.com/problems/maxim...

  • [Leetcode421](python): 数组中两个数之间最

    1. 题目来源 分类:字典树 Leetcode421:数组中两个数的最大异或值 2. 题目描述 给定一个非空数组,...

  • 05_关系运算、逻辑运算、分支和循环

    关系运算 > < == ~= 关系运算符,返回值0或1 比较数组与数字时按元素比较, 比较数组与数组也是按元素比...

  • 2018-04-16数组排序

    数组排序 sort 按照数组值或元素从小到大排列数组 rsort 按照数组值或元素从大到小排列数组(以上两种排序...

  • 二分查找

    二分查找(折半查找):前提: 数据已经有序排放在数组中,通过将待查的元素与数组最中间元素进行对比,如果大于中间值,...

  • 2018-01-18

    数组中每个元素出现的次数 返回的obj中的属性名是数组中的每个元素值,属性值是数组中相同的元素的个数。

  • JS 函数封装

    返回数组或对象的长度 返回数组中的非假值组成一个新数组 返回数组中任意一个元素 数组去重复

  • 有两个数组a,b, 大小都是n,数组元素的值任意,无序. 要求:

    题目:有两个数组a,b, 大小都是n,数组元素的值任意,无序. 要求:通过交换a b中的元素,使数组a元素的和与数...

  • 数组

    简介 数组:值的有序集合。 元素:数组的每个值。数组元素可以是任意类型 索引:每个元素在数组中的位置,以数字表示。...

  • C# 数组

    概述 多维数组每个维度的元素个数是相同的;交错数组是数组中的数组。 数值类型数组元素默认值为0,引用类型元素默认值...

网友评论

      本文标题:5640. 与数组中元素的最大异或值

      本文链接:https://www.haomeiwen.com/subject/tobonktx.html