• 题解0014:信奥一本通1472——The XOR Largest Pair(字典树)


    题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1472

    题目描述:在给定的 N">N 个整数A1,A2,,AN">中选出两个进行异或运算,求得到的结果最大是多少。

    看到这道题要搞异或,首先想到把它们转成二进制。

    那用什么存呢?

    这就要用到一个比较NB的算法——字典树了。

    (对字典树不太了解的可以先看我另一篇博客——https://www.cnblogs.com/wdrdsahudhisjabshdahuhsh/p/16323517.html

    这就是把一堆整数转成2进制数,再存到字典树里,并用字典树查找最大结果。

    (ps:异或就是二进制中当两个值不相同时返回1,否则返回0)

    上代码(有注释):

    复制代码
     1 #include
     2 using namespace std;
     3 int a,trie[4000001][2],tot=0;
     4 void in(int a){//转成二进制并存入字典树 
     5     int root=0,id;
     6     for(int i=30;i>=0;i--){//从最高位开始 
     7         id=(a>>i)&1;//提取a在二进制中第i位的值 
     8         if(trie[root][id]==0){
     9             trie[root][id]=++tot;
    10         }
    11         root=trie[root][id];//字典树
    12     }
    13 }
    14 int out(int a){
    15     int root=0,id,ans=0;
    16     for(int i=30;i>=0;i--){
    17         id=(a>>i)&1;
    18         if(trie[root][!id]){//找到不同的值了 
    19             ans=ans|(1<//加上异或这一位的值 
    20             root=trie[root][!id];//换节点继续查 
    21         }else{
    22             root=trie[root][id];//直接往下走 
    23         }
    24     }
    25     return ans;
    26 }
    27 int main(){
    28     int n,ans=0;
    29     cin>>n;
    30     while(n--){
    31         cin>>a;
    32         in(a);
    33         ans=max(ans,out(a));//求最大值 
    34     }
    35     cout<//完事 
    36 }
    复制代码
  • 相关阅读:
    Python 中调用 Java 的 JAR 包
    Element的步骤条el-steps加入插槽内容
    【SpringBoot】多环境配置
    发明专利和实用新型专利的区别
    LSF如何看job预留slot是否合理?
    谈谈 MySQL 事务隔离级别
    c++11产生指定范围内均匀分布随机数、产生大量不重复随机数
    扬帆出海,拒做云内卷王?
    针对FTP的SSRF攻击
    酷开科技 | 酷开系统时时刻刻相伴你左右
  • 原文地址:https://www.cnblogs.com/wdrdsahudhisjabshdahuhsh/p/16343555.html