zoukankan      html  css  js  c++  java
  • Acwing143. 最大异或对

    在给定的N个整数A1A2ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?

    输入格式

    第一行输入一个整数N。

    第二行输入N个整数A1A1~ANAN。

    输出格式

    输出一个整数表示答案。

    数据范围

    1N1051≤N≤105,
    0Ai<2310≤Ai<231

    输入样例:

    3
    1 2 3
    

    输出样例:

    3

    思路:异或为不进位加法。
    找出两个个数字的异或最大值,那么每个数字可以用二进制表示。用tire树存放个数字的二进制。
    #include <iostream>
    
    using namespace std;
    const int maxn= 1e5+10;
    const int maxm=maxn*31;
    int a[maxn];
    int tree[maxm][2],idx;
    void tireinsert(int x)
    {
        int root=0;
        for(int i=30;i>=0;i--)
        {
            int u= x >> i & 1;
            if(!tree[root][u]) tree[root][u] = ++idx;
            root=tree[root][u];
        }
    }
    
    int tirefind(int x)
    {
        int root=0,res=0;
        for(int i=30;i>=0;i--)
        {
            int u=x >> i & 1;
            if(tree[root][!u])
            {
                root=tree[root][!u];
                res=res*2+!u;
            }
            else
            {
                root=tree[root][u];
                res=res*2+u;
            }
        }
        return res;
    }
    
    int main()
    {
        int n;
        cin >> n;
        for(int i=0;i<n;i++)  scanf("%d",&a[i]);
        int ans=0;
        for(int i=0;i<n;i++)
        {
            tireinsert(a[i]);
            int num=tirefind(a[i]);//要异或的那个数字
            ans=max(ans,num^a[i]);
        }
        cout << ans ;
        return 0;
    }
  • 相关阅读:
    将文件移出版本控制 (Revision Control)
    luogu 1966 火柴排队
    bzoj 1069 最大土地面积
    bzoj 1060 时态同步
    luogu 1901 发射站
    bzoj 1007 水平可见直线
    bzoj 2654 tree
    luogu 2024 食物链
    10.21 模拟赛
    tyvj 1013 找啊找啊找GF
  • 原文地址:https://www.cnblogs.com/wjc2021/p/11197338.html
Copyright © 2011-2022 走看看