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;
    }
  • 相关阅读:
    03JavaScript实现轮播特效21
    03JavaScriptBOM(location...)20
    03JavaScriptBOM(window)19
    03JavaScriptDOM事件18
    03JavaScriptDOM基础17
    03JavaScript函数16
    03JavaScript的流程控制语句15
    03JavaScript语法14
    02css布局案例
    Sublime Text 3 配置 C/C++ 编译器
  • 原文地址:https://www.cnblogs.com/wjc2021/p/11197338.html
Copyright © 2011-2022 走看看