• 143. 最大异或对


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

    输入格式

    第一行输入一个整数N。

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

    输出格式

    输出一个整数表示答案。

    数据范围

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

    输入样例:

    3
    1 2 3
    

    输出样例:

    3

    思路:
        每个数散成二进制存进tire树里边,找能和当前二进制xor成1的最大数字取最大值,只需要从跟走到叶节点就可以找到和当前数字最大的数了,这样的话每个数字最多走31位也就是总共的次数最多是31*100000,所以时间复杂度相当于nlogn
    

      



    #include<iostream>
    
    using namespace std;
    //int 单个整数最大二进制是31个1,tire存储的每个分支数最多有31个节点
    const int N = 1e5+10,M = 31*N;
    
    int n;
    int a[N];
    //每个节点有01两种情况所以是2
    int son[M][2],idx;
     
    void insert(int x){
        int p = 0;
        for(int i = 30;i >= 0;i--)
        {
            //取第i位的二进制数是什么东西
            int u = x >> i & 1;
            if(!son[p][u]) son[p][u] = ++idx;
            p = son[p][u];
        }
    }
     
    int query(int x){
        int p = 0,res = 0;
        for(int i = 30;i >= 0;i--){
            int u = x >> i & 1;
            if(son[p][!u]){
                p = son[p][!u];  
                res = res * 2 + !u;  
                
            } else{
                p = son[p][u];   
                res = res * 2 + u;
            }
        }
        return res;
    }
    int main(){
        cin >> n;
        for(int i = 0;i < n;i++) cin >> a[i];
        
        int res = 0;
        //先插入,少一个判空的条件,所以先插入
        for(int i = 0;i < n;i++){
            insert(a[i]);
            int t = query(a[i]);
            res = max(res,a[i] ^ t);
        }
        
        cout << res;
        
        
    }
    

      

  • 相关阅读:
    python笔记1
    git笔记
    手撸一个简陋直播系统
    spring-boot学习笔记1
    设计模式1--简单工厂模式
    网联:第一章:浏览器生成消息
    php线上预览日志--4.websocket客户端
    php线上预览日志--3.websocket服务部署
    php线上预览日志--2.谷歌插件开发
    php线上预览日志--1.概述
  • 原文地址:https://www.cnblogs.com/luyuan-chen/p/11632048.html
Copyright © 2020-2023  润新知