• trie 143. 最大异或对


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

    输入格式

    第一行输入一个整数 NN。

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

    输出格式

    输出一个整数表示答案。

    数据范围

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

    输入样例:
    1. 3
    2. 1 2 3
    输出样例:
    3

    代码

    1. #include
    2. #include
    3. using namespace std;
    4. const int N=100010,M=31*N;
    5. int n;
    6. int a[N],son[M][2],idx;
    7. void insert(int x)
    8. {
    9. int p=0;
    10. for(int i=30;i>=0;i--)
    11. {
    12. int &s=son[p][x>>i&1];
    13. if(!s) s=++idx;
    14. p=s;
    15. }
    16. }
    17. int search(int x)
    18. {
    19. int p=0,res=0;
    20. for(int i=30;i>=0;i--)
    21. {
    22. int s=x>>i&1;
    23. if(son[p][!s])
    24. {
    25. res+=1<
    26. p=son[p][!s];
    27. }
    28. else p=son[p][s];
    29. }
    30. return res;
    31. }
    32. int main()
    33. {
    34. scanf("%d",&n);
    35. for(int i=0;i
    36. {
    37. scanf("%d",&a[i]);
    38. insert(a[i]);
    39. }
    40. int res=0;
    41. for(int i=0;i
    42. {
    43. res=max(res,search(a[i]));
    44. }
    45. printf("%d\n",res);
    46. return 0;
    47. }

    今天下午暗下决心做三个题目,结果发现做这一个题目就已经非常吃力了。这个题目其实暑假的时候就已经看了题解,早几天看了讲解视频,还是有一些一知半解的。

    主要的思路是建立一个trie树,然后异或运算是不进位加法,意思就是说,一个数字用二进制方法来表示,如果对应数位上的数字不相同,结果就是1,如果两个数字相同,结果就是0。

    我们先把输入的数字使用二进制来进行表示,二进制表示使用算术右移和&运算来进行实现。

    x>>i&1

    我们知道,数位越高,对数字的影响越大,所以我们从最高位开始考虑问题。

    insert函数是用来建立一个trie树的

    search函数是用来寻找当前数字的最大的异或数值

    假设我们现在数位是1,我们需要的数字就是0,我们选择有0的数字去进行异或运算,如果没有0,我们再去考虑其他情况,有点像是有很多数字可以供选择,我们选择一个满足条件的最优解

    res+=1<

    这一行是进制的知识,就是把分散的数字归整成为一个十进制数字,可能会成为最后的答案数值 

     

     

     

  • 相关阅读:
    文件上传过大被限制问题-springboot
    vscode设置tab或者enter补全代码
    快速入门js
    数字化仪的超声波应用
    22.0、C语言——内存函数的剖析和使用
    深度学习——损失函数推导过程(三个方面诠释损失函数的由来意义)
    仿牛客网讨论社区项目—项目总结及项目常见面试题
    安卓将图片分割或者拉伸或者旋转到指定尺寸并保存到本地
    Go语言入门【7】指针
    如何用 Java 写一个 Java 虚拟机
  • 原文地址:https://blog.csdn.net/L3102250566/article/details/133364632