思路:

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

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

实现:

 #include <iostream>
using namespace std; const int INF = 0x3f3f3f3f;
const int N = ;
int a[N], cnt = ; struct trieNode
{
trieNode * next[];
}; trieNode pool[N * ]; trieNode * createTrie()
{
trieNode * root = &pool[cnt++];
for (int i = ; i < ; i++)
{
root->next[i] = NULL;
}
return root;
} void insert(trieNode * root, int x)
{
trieNode * tmp = root;
int index;
for (int i = ; i >= ; i--)
{
int msk = ( << i);
if (msk & x) index = ;
else index = ;
if (tmp->next[index] == NULL)
{
tmp->next[index] = createTrie();
}
tmp = tmp->next[index];
}
} int search(trieNode * root, int x)
{
trieNode * tmp = root;
int res = ;
for (int i = ; i >= ; i--)
{
int msk = << i;
int need;
if (msk & x) need = ;
else need = ;
if (i == ) need = - need;
if (tmp->next[need])
{
res += (need << i);
tmp = tmp->next[need];
}
else
{
res += ( - need << i);
tmp = tmp->next[ - need];
}
}
return x ^ res;
} int main()
{
int n;
while (cin >> n)
{
cnt = ;
trieNode * root = createTrie();
for (int i = ; i <= n; i++)
{
cin >> a[i];
a[i] = a[i - ] ^ a[i];
insert(root, a[i]);
}
insert(root, );
int ans = -INF;
for (int i = ; i <= n; i++)
{
ans = max(ans, search(root, a[i]));
}
cout << ans << endl;
}
return ;
}

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. Swift类型转换

    关于「类型转换」(Type Casting),<The Swift Programming Language>描述如下: Type casting is a way to check th ...

  2. AndroidStudio检测不到genymotion虚拟设备

    重启adb 单击  Reset adb

  3. 蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归

    标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5次, ...

  4. disablescroll

    页面的设置 disablescroll:true(需要配合设置 enablePullDownRefresh:false ) 可以实现页面上下不能滑动 另一种实现方法: 设置页面的根元素 绝对定位, p ...

  5. PowerDesigner里怎样查找特定的表

    转自:https://blog.csdn.net/u013178480/article/details/78261650 crtl+f查找,在code处输入你要查找的表名,然后点击“find now& ...

  6. opencv Mat.at

    opencv c++ mat获取像素及像素赋值 For accessing pixel's channel value : ; i < image.cols; i++) { ; j < i ...

  7. 技术胖Flutter第三季-17布局PositionedWidget层叠定位组件

    博客地址: https://jspang.com/post/flutter3.html#toc-d7a 把我们上节的 Container的部分代码去掉. 使用:Positioned 有点像css里面的 ...

  8. PYTHON3中 类的继承

    继承 1:什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹. 新建的类成为子类或者派生类. 父类又可以成为基类或者 ...

  9. Channel的使用

    Channel必须要通过buffer来读写 1. Channel需要通过IO流的getChannel()方法获取 2. buffer需要通过Channel的map()方法获取 package com. ...

  10. Docker管理应用数据

    1.  Manage data in Docker 默认情况下,所有在容器内部创建的文件被存储在一个可写的容器层.这就意味着: 当容器不存在的时候,数据不能被持久化,而且在容器外部想要读取这些数据十分 ...