思路:

把N个前缀异或和插入一棵trie树中,然后对每个前缀异或和x计算能使x ^ y最大的前缀异或和y。利用了异或运算的a ^ b ^ a = b的性质。

参考了https://cloud.tencent.com/developer/article/1343206

实现:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const int INF = 0x3f3f3f3f;
  5. const int N = ;
  6. int a[N], cnt = ;
  7.  
  8. struct trieNode
  9. {
  10. trieNode * next[];
  11. };
  12.  
  13. trieNode pool[N * ];
  14.  
  15. trieNode * createTrie()
  16. {
  17. trieNode * root = &pool[cnt++];
  18. for (int i = ; i < ; i++)
  19. {
  20. root->next[i] = NULL;
  21. }
  22. return root;
  23. }
  24.  
  25. void insert(trieNode * root, int x)
  26. {
  27. trieNode * tmp = root;
  28. int index;
  29. for (int i = ; i >= ; i--)
  30. {
  31. int msk = ( << i);
  32. if (msk & x) index = ;
  33. else index = ;
  34. if (tmp->next[index] == NULL)
  35. {
  36. tmp->next[index] = createTrie();
  37. }
  38. tmp = tmp->next[index];
  39. }
  40. }
  41.  
  42. int search(trieNode * root, int x)
  43. {
  44. trieNode * tmp = root;
  45. int res = ;
  46. for (int i = ; i >= ; i--)
  47. {
  48. int msk = << i;
  49. int need;
  50. if (msk & x) need = ;
  51. else need = ;
  52. if (i == ) need = - need;
  53. if (tmp->next[need])
  54. {
  55. res += (need << i);
  56. tmp = tmp->next[need];
  57. }
  58. else
  59. {
  60. res += ( - need << i);
  61. tmp = tmp->next[ - need];
  62. }
  63. }
  64. return x ^ res;
  65. }
  66.  
  67. int main()
  68. {
  69. int n;
  70. while (cin >> n)
  71. {
  72. cnt = ;
  73. trieNode * root = createTrie();
  74. for (int i = ; i <= n; i++)
  75. {
  76. cin >> a[i];
  77. a[i] = a[i - ] ^ a[i];
  78. insert(root, a[i]);
  79. }
  80. insert(root, );
  81. int ans = -INF;
  82. for (int i = ; i <= n; i++)
  83. {
  84. ans = max(ans, search(root, a[i]));
  85. }
  86. cout << ans << endl;
  87. }
  88. return ;
  89. }

hihocoder1860 最大异或和的更多相关文章

  1. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  2. Oracle数据库异机升级

    环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...

  3. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  4. [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...

  5. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

  6. RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例

    测试环境:     操作系统  :  Red Hat Enterprise Linux ES release 4 (Nahant Update 4)   VMWARE     数据库     :  O ...

  7. RAC异机恢复

    RAC异机恢复PDCL到PFCL: PNCL:RAC+ASM ,product env   db name:PNCL   instance:PDCL1 PDCL2 PFCL:RAC+ASM ,perf ...

  8. BZOJ 3261: 最大异或和

    Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...

  9. 异或之(bzoj 3689)

    Description 给定n个非负整数A[1], A[2], --, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这 ...

随机推荐

  1. sip协议呼叫流程详解

    1.SIP业务基本知识 1.1 业务介绍会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和终 ...

  2. Thief in a Shop

    题意: 问n个物品选出K个可以拼成的体积有哪些. 解法: 多项式裸题,注意到本题中 $A(x)^K$ 的系数会非常大,采用NTT优于FFT. NTT 采用两个 $2^t+1$ 质数,求原根 $g_n$ ...

  3. json 与pickle模块(序列化与反序列化))

    一.什么是序列化(pickling): 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 序列化可以持久保存状态, 不会根据计算机断电或者重启程序,而使得之前的数据状态丢失.可以在下次程 ...

  4. 51nod - 1188 - 最大公约数之和 V2 - 数论

    https://www.51nod.com/Challenge/Problem.html#!#problemId=1188 求\(\sum\limits_{i=1}^{n-1}\sum\limits_ ...

  5. 优化jQuery选择器

    优化jQuery选择器 选择优化比以前更加重要,因为越来越多的浏览器实现了queryselectorall()并承担了将jQuery选择器转移到浏览器的责任.记住这些小技巧可以让你轻松突破学习选择器时 ...

  6. 七牛上传图片视频demo

    /引入Plupload .qiniu.js后 varuploader = Qiniu.uploader({ runtimes:'html5,flash,html4',//上传模式,依次退化 brows ...

  7. windows7激活及office2013激活

    步骤 1.安装KMSpico 密码:dzit 2.安装.NET Framework 4 密码:vnus 3.解压KMSpico,运行文件,等待语音结束即可激活windows7及office2013 注 ...

  8. Unity中HideInInspector和SerializeField

    http://blog.sina.com.cn/s/blog_697b1b8c0102uxvn.html Unity会自动为Public变量做序列化,序列化的意思是说再次读取Unity时序列化的变量是 ...

  9. Java之多线程同步基础

    java学习的道路上呢总有一些麻烦的东西需要花费一些时间去理解,比如个人认为不好搞的多线程. 线程是并列运行的 因为是并列运行,所以有时候会发生资源抢占,从而导致参数变化; 比如酱紫 package ...

  10. button 获取 cell

        - (void)cellBtnClicked:(id)sender event:(id)event {     NSSet *touches =[event allTouches];      ...