zoukankan      html  css  js  c++  java
  • 字典树-THE XOR largest pair

    题目:给你n个数字A1,A2....An ,问从中选出两个数字异或运算得到的最大结果是多少 0<=Ai<231

    用字典树,记录每个数字的31位2进制01串(int 为4个字节,每个字节8个二进制,int一共32位,最高位为符号位,所以不考虑)

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5*33;
    int trie[maxn][2];
    int a[maxn];
    int tot=1;
    int main()
    {
        int n;
        cin>>n;
        for(int j=1; j<=n; j++) // 把n个数字的 0 1 串从高位到低位存入字典树 
        {
            cin>>a[j];
            int p=1;
            for(int i=30; i>=0; i--)
            {
                int k=(a[j]>>i)&1;
                if(trie[p][k]==0) trie[p][k]=++tot;
                p=trie[p][k];
            }
        }
        int maxx=0;
        for(int i=1; i<=n; i++) // 对于每个数字 从高位到低位判断每个为0还是1,然后专门找与它不同的往下探索,如果没有不同只能取相同,因为是从高位到低位可以保证得到的t串与这个数字异或得到最大值 
        {
            int p=1;
            int t=0;
            for(int j=30; j>=0; j--)
            {
                int k=(a[i]>>j)&1;
                if(trie[p][k^1])
                {
                    t=(t<<1)+(k^1); // 必须加括号 
                    p=trie[p][k^1];
                }
                else
                {
                    t=(t<<1)+k;  // 必须加括号 
                    p=trie[p][k];
                }
            }
            maxx=max(maxx,t^a[i]);
        }
        cout<<maxx<<endl;
    }
    // 测试数据 
    //10
    //181262 369842 1036879 546331 868986 496157 646816 459571 215643 448018 
    
    //1033222
  • 相关阅读:
    实验0 了解和熟悉操作系统一、目的和要求
    读后感
    有穷自动机自动转化
    文法分析
    词法分析随笔
    git操作笔记
    面试题汇总
    MYSQL数据库设计
    Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
    invalid comparison:java.util.Date and java.lang.String
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10671761.html
Copyright © 2011-2022 走看看