• The XOR Largest Pair


    # 10050. 「一本通 2.3 例 2」The XOR Largest Pair

    【题目描述】

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

    【算法】

    trie树经典题目。以每个数字的二进制数串逆向由第31位向第0位建立trie树。用两个指针,一个插入指针插入每一位,一个查询指针贪心的取和当前插入数串的位相反的,若无相反的则只能沿相同的走(保证尽可能高的位尽可能大),注意为保证无论如何能走先插入再查询。(注意:$rec[]$ 数组要置0,查了半天- -)

    【代码】

    #include <bits/stdc++.h>
    using namespace std;
    int x,n,tot=1,ans;
    int trie[4000100][2],rec[32];
    inline int read() {
        int x=0,f=1; char c=getchar();
        while(c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }
        while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); }
        return x*f;
    }
    void parse(int x) {
        memset(rec,0,sizeof(rec));
        for(int i=0;x;x>>=1,i++) rec[i]=x&1;
    }
    void add(int x) {
        int now=0,p=1,pp=1;
        parse(x);
        for(int i=31;i>=0;i--) {
            if(trie[p][rec[i]]==0) trie[p][rec[i]]=++tot;
            p=trie[p][rec[i]];
            if(trie[pp][!rec[i]]) now<<=1,now++,pp=trie[pp][!rec[i]];
            else pp=trie[pp][rec[i]],now<<=1;
        }
        ans=max(ans,now);
    }
    int main() {
        n=read();
        for(int i=1;i<=n;i++) {
            x=read();
            add(x);
        }
        printf("%d
    ",ans);
        return 0;
    }
    
    
  • 相关阅读:
    Oracle 更改DBID
    Oracle 修改字段长度
    Oracle 索引
    Oracle在无法打开数据库的状态下获取DBID
    Oracle 备份脚本
    Linux crontab计划任务
    Oracle restore和recovery的区别
    Django基础
    面向对象(一)
    socket
  • 原文地址:https://www.cnblogs.com/Willendless/p/9623682.html
Copyright © 2020-2023  润新知