zoukankan      html  css  js  c++  java
  • 143. 最大异或对(Trie树存整数+二进制)

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

    输入格式

    第一行输入一个整数N。

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

    输出格式

    输出一个整数表示答案。

    数据范围

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

    输入样例:

    3
    1 2 3
    

    输出样例:

    3


    暴力做法:O(n^2)
    import java.util.Scanner;
    
    public class Main{
              static int a[]=new int[100005];
              public static void main(String[] args) {
                    Scanner scan=new Scanner(System.in);
                    int n=scan.nextInt();
                    for(int i=0;i<n;i++) a[i]=scan.nextInt();
                    int max=-1;
                      for(int i=0;i<n;i++)
                          for(int j=0;j<i;j++)
                              max=Math.max(max, a[i]^a[j]);
                      System.out.println(max);
                              
            }
    }
    对此步做优化
     for(int i=0;i<n;i++)
         for(int j=0;j<i;j++)//----这一步
            max=Math.max(max, a[i]^a[j]);

    O(n*logn)

     异或运算,同为0,不同为1

     建立trie树,左0右1

     先插入一个整数,然后查询,查询过程中,如果u是1,就尽可能往0那边走;如果u是0,就尽可能往1那边走

    AC代码:
    import java.util.Scanner;
    
    public class Main{
            static final int N=100005,M=N*31;
            static int a[]=new int[N];
            static int son[][]=new int [M][2];
            static int idx=0;
            static void insert(int x){
                    int p=0;
                    for(int i=30;i>=0;i--){
                            int u=x>>i&1;
                            if(son[p][u]==0) son[p][u]=++idx;
                            p=son[p][u];
                    }
            }
            static int query(int x){
                    int p=0,res=0;
                    for(int i=30;i>=0;i--){
                            int u=x>>i&1;
                            //如果u是1,就尽可能往0那边走;如果u是0,就尽可能往1那边走
                            if(son[p][u==1?0:1]!=0){
                                    p=son[p][u==1?0:1];
                                    res=res*2+(u==1?0:1);//加括号,优先级问题
                            }
                            else{
                                    p=son[p][u];
                                    res=res*2+u;
                            }
                    }
                    return res;
            }
            public static void main(String[] args) {
                     Scanner scan=new Scanner(System.in);
                     int n=scan.nextInt();
                     for(int i=0;i<n;i++) a[i]=scan.nextInt();
                     int res=0;
                     for(int i=0;i<n;i++){
                             insert(a[i]);
                             int num=query(a[i]);
                             res=Math.max(res, a[i]^num);
                     }
                     System.out.println(res);
            }
    }
  • 相关阅读:
    利用兼容DC和兼容位图实现图形重绘
    MFC实现文件打开和保存功能实现
    CFile文件操作示例
    利用互斥对象实现线程同步的实例说明
    bootstrap3 input 验证样式【转】
    js event 冒泡和捕获事件详细介绍【转】
    Html+Ajax+Springmvc+Mybatis,不用JSP【转】
    hp电脑重装win7 64位 后 所有软件都装不上问题【转】
    bootstrap 模态 modal 小例子【转】
    servlet 获取 post body 体用流读取为空的问题【转】
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12234248.html
Copyright © 2011-2022 走看看