• The XOR Largest Pair


    https://loj.ac/problem/10050

    题目描述

      给出(n)个整数,求选出两个数使它们的异或值最大。

    思路

      解决异或问题也是字典树的常用作用之一。我们考虑对于一个数(x),我们如何求出它的异或值最大的另一个数。异或的定义是每一位相同为(0),不同为(1),所以我们只需要查找二进制下每一位都和(x)不同的数。而这道题实际给定范围,那么我们可以考虑建一棵字典树,存二进制每一位的值,对于查找的数(x),我们只需要从高位往低位枚举,尽量找每一位与这个数这一位不同即可。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN=1e5+10;
    int ch[MAXN<<5][3],tot,a[MAXN];
    void insert(int x)
    {
        int u=1;
        for(int i=1<<30;i;i>>=1)
        {
            int num=(x&i)?1:0;
            if(!ch[u][num])ch[u][num]=++tot;
            u=ch[u][num];
        }
    }
    int find(int x)
    {
        int ans=0;
        int u=1;
        for(int i=1<<30;i;i>>=1)
        {
            int num=(x&i)?0:1;
            if(ch[u][num])
            {
                ans+=i;
                u=ch[u][num];
            }
            else u=ch[u][!num];
        }
        return ans;
    }
    int main() 
    {
        int n;
        tot=1;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            insert(x);
            a[i]=x;
        }
        int ans=0;
        for(int i=1;i<=n;i++)
            ans=max(ans,find(a[i]));
        printf("%d",ans);
        return 0;
    }
    
  • 相关阅读:
    tomcat部署https
    Java程序内存的简单分析
    接口设计原则
    英语常用口语
    洛谷 P3956 棋盘
    洛谷 P1101 单词方阵
    二分查找模板(准确找定值)
    洛谷 P1892 [BOI2003]团伙
    浅谈二分的边界问题
    deque简单解析
  • 原文地址:https://www.cnblogs.com/fangbozhen/p/11788231.html
Copyright © 2020-2023  润新知