首页 > 其他分享 >【LC周赛-371】 D. Trie树求最大异或对

【LC周赛-371】 D. Trie树求最大异或对

时间:2023-11-12 12:22:50浏览次数:33  
标签:周赛 LC nums Trie res int trie root id

【LC周赛-371】 D. Trie树求最大异或对


题意

  • 给一个数组,求两个数满足|x-y|<=min(x,y)的异或最大值。

题解

  • 从|x-y|<=min(x,y)知道,每个y可以考虑的x范围是 y / 2 <= x < y;
  • 然后Trie树实现更优复杂度内,从窗口获得最大异或值
  • 思路就是高位依次取值,具体看代码吧

代码

const int N = 1e6 + 5;
int trie[N][2];
int num[N];
int cnt = 1;

void trie_Insert(int x){
    int root = 0;
    for(int i = 20; i >= 0; -- i){
        int id = (x>>i)&1;
        if(!trie[root][id]) trie[root][id] = ++ cnt;
        root = trie[root][id];
        num[root] ++;
    }
}

void trie_del(int x) {
    int root = 0;
    for(int i = 20; i >= 0; -- i) {
        int id = (x>>i)&1;
        root = trie[root][id];
        num[root] --;
    }
}

int trid_Xormax(int x) {
    int root = 0;
    int res = 0;
    for(int i = 20; i >= 0; -- i) {
        int id = (x>>i)&1;
        if(num[trie[root][!id]]) {
            root = trie[root][!id];
            res = (res << 1) + 1;
        } else {
            root = trie[root][id];
            res = (res << 1) + 0; 
        }
    }
    return res;
}

class Solution {
public:
    int maximumStrongPairXor(vector<int>& nums) {
        memset(trie, 0, sizeof(trie));
        memset(num, 0, sizeof(num));
        cnt = 1;
        sort(nums.begin(), nums.end());
        int n = nums.size();
        int l = 0, r = 1;
        int res = 0;
        trie_Insert(nums[0]);
        while(r < n) {
            while(l < r && nums[l] * 2 < nums[r]) {
                trie_del(nums[l]);
                l ++;
            }
            res = max(res, trid_Xormax(nums[r]));
            trie_Insert(nums[r]);
            r ++;
        }
        return res;
    }
};

标签:周赛,LC,nums,Trie,res,int,trie,root,id
From: https://www.cnblogs.com/A-sc/p/17826968.html

相关文章

  • 第371场周赛
    至少在态度上有进步昨天参加了今天也参加了  跟昨晚的类似第一题和第四题都是一样的但是plus版要求时间复杂度给你一个下标从 0 开始的整数数组 nums 。如果一对整数 x 和 y 满足以下条件,则称其为 强数对 :|x-y|<=min(x,y)你需要从 nums 中选出两个......
  • 第117场双周赛-3min签到题,然后做不了一点
     给你两个正整数 n 和 limit 。请你将 n 颗糖果分给 3 位小朋友,确保没有任何小朋友得到超过 limit 颗糖果,请你返回满足此条件下的 总方案数 。 示例1:输入:n=5,limit=2输出:3解释:总共有3种方法分配5颗糖果,且每位小朋友的糖果数不超过2:(1,2,2),(2......
  • 格式转换:相机帧void* pBuffer,QImage,cv::Mat,Halconcpp::HObject
    【说明】1、若传递的是指针,则内存共享,其一改变,另一个也被改变。为了避免输入被更改,做了些处理。如QImage2Mat中使用了两个变量mat,out。2、有的存在宽度方向4字节对齐情况,所以做了些处理。如QImage2HObject中让宽度变为4的整数倍。 【相机帧void*pBuffer赋给其他格式】 ......
  • /bin/ld: cannot find -lcolamd
     001、make编译报错:/bin/ld:cannotfind-lcolamd 002、查找该文件(py38)[[email protected]]#find/-name"libcolamd.so"##系统上不存在该文件;那么解决的话就应该安装,但是安装什么呢? 003、在其他机器上查找该文件(base)[b20223040323......
  • Flask-MySQLdb与Flask-SQLAlchemy
    Flask-MySQLdb和Flask-SQLAlchemy是Flask中用于与MySQL数据库交互的两个不同的扩展。它们有不同的使用方式和优劣势。Flask-MySQLdb:用法:fromflaskimportFlaskfromflask_mysqldbimportMySQLapp=Flask(__name__)app.config['MYSQL_HOST']='your_mysq......
  • 【pwn】[HGAME 2023 week1]simple_shellcode --orw利用攻击
    先查看程序的保护状态可以看到,保护全开,拖进ida看主函数的逻辑可以看到有个mmap函数:mmap()函数是Unix和类Unix操作系统中的一个系统调用,用于在进程的地址空间中映射文件或者其它对象。这样做的好处是可以让文件直接映射到内存中,从而避免了频繁的文件I/O操作,提高了文件的读......
  • /bin/ld: cannot find -lmysqlclient
     001、make编译报错:/bin/ld:cannotfind-lmysqlclient 002、查找相关文件(base)[[email protected]]#find/-name*libmysqlclient.so*##lib+提示的缺失文件+.so 003、复制一份到/usr/lib中(base)[[email protected]]#cp/usr/lib64......
  • CF1304E 1-Trees and Queries(lca+树上前缀和+奇偶性)
    题目二话不说,直接按题意模拟暴搜,当然\(O(nq)\)的复杂度显然是寄了的。不过,在模拟的过程中,我在链式前向星的删边中居然一开始错了,还是要mark一下以后注意。voiddel(intx,intpre){ e[top].to=e[top].next=0; h[x]=pre;//h[x]=0;<---tip}intmain(){ ......
  • 解决MySQL8报错:Public Key Retrieval is not allowed
    问题分析:这个是由于配置的URL中的useSSL为false导致的,当其为false后,mysql将会检查allowPublicKeyRetrieval是不是TRUE,由于开启allowPublicKeyRetrieval不安全可能遭到中间人攻击(英语:Man-in-the-middleattack,缩写:MITM),所以allowPublicKeyRetrieval的值默认为false。两项都为false后......
  • DP查缺补漏之LCS状态重叠
    DP查缺补漏之\(LCS\)状态重叠状态假设\(F[i][j]\)为\(a\)串中前\(i\)个字符,\(b\)串中前\(j\)个字符构成的\(LCS\)状态转移\(F[i-1][j-1]+1\)即当且仅当\(a[i]=b[j]\)时,从两个序列的减去当前的字符加一推出\(F[i-1][j]\)不选\(a[i]\),只选\(b[j]\)\(F[i......