题目描述

输入

输入数据的第一行包含一个整数N,表示数组中的元素个数。
第二行包含N个整数A1,A2,…,AN。

输出

输出一行包含给定表达式可能的最大值。

样例输入

5
1 2 3 1 2

样例输出

6


题解

Trie树

还是本着100000(2)>011111(2)的原则,显然需要从高位贪心取值。

又因为x^x=0,所以有$a_l\oplus a_{l+1}\oplus \cdots\oplus a_{r-1}\oplus a_r=(a_1\oplus a_2\oplus\cdots\oplus a_{l-2}\oplus a_{l-1})\oplus(a_1\oplus a_2\oplus\cdots\oplus a_{r-1}\oplus a_{r})$

这样如果我们知道了r,就能够贪心求出最大的异或和。

所以我们可以从左往右将前缀异或和按位加入到Trie树中,并在每次添加后贪心求出最大的异或和,记为f[i],表示以i结尾的连续子序列的异或和的最大值。

然后再维护f[i]的前缀最大值,为1~i中所有连续子序列的异或和的最大值。

从右往左进行同样的操作,为i~n中所有连续子序列的异或和的最大值。

这样,我们枚举一个位置,它左边的最大值和它右边的最大值之和就是所求,求一下最大值即为答案。

#include <cstdio>
#include <algorithm>
#define N 400010
using namespace std;
struct data
{
int next[N * 30][2] , tot;
void insert(int v)
{
int x = 0 , i;
bool t;
for(i = 1 << 30 ; i ; i >>= 1)
{
t = v & i;
if(!next[x][t]) next[x][t] = ++tot;
x = next[x][t];
}
}
int query(int v)
{
int x = 0 , i , ret = 0;
bool t;
for(i = 1 << 30 ; i ; i >>= 1)
{
t = v & i;
if(next[x][t ^ 1]) ret += i , x = next[x][t ^ 1];
else x = next[x][t];
}
return ret;
}
}A , B;
int a[N] , m1[N] , m2[N];
int main()
{
int n , i , t , ans = 0;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &a[i]);
A.insert(0) , B.insert(0);
for(t = 0 , i = 1 ; i <= n ; i ++ ) t ^= a[i] , A.insert(t) , m1[i] = max(m1[i - 1] , A.query(t));
for(t = 0 , i = n ; i >= 1 ; i -- ) t ^= a[i] , B.insert(t) , m2[i] = max(m2[i + 1] , B.query(t));
for(i = 1 ; i < n ; i ++ ) ans = max(ans , m1[i] + m2[i + 1]);
printf("%d\n" , ans);
return 0;
}

【bzoj4260】Codechef REBXOR Trie树的更多相关文章

  1. 【BZOJ4260】Codechef REBXOR Trie树+贪心

    [BZOJ4260]Codechef REBXOR Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output ...

  2. BZOJ4260: Codechef REBXOR (01Tire树)

    题意 题目链接 Sol 首先维护出前缀xor和后缀xor 对每个位置的元素插入到Trie树里面,每次找到和该前缀xor起来最大的元素 正反各做一遍,取最大. 记得要开log倍空间qwq.. #incl ...

  3. bzoj 4260 Codechef REBXOR——trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4260 一段的异或和就是两个前缀的异或和.正反扫两边,用trie树算每个位置为左/右端点时最大 ...

  4. BZOJ 4260: Codechef REBXOR (trie树维护异或最大值)

    题意 分析 将区间异或和转化为前缀异或和.那么[L,R][L,R][L,R]的异或和就等于presum[R] xor presum[L−1]presum[R]\ xor \ presum[L-1]pr ...

  5. 【bzoj4260】 Codechef REBXOR trie树

    Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN.     Output 输出一行包含给定表达式可能的最大值.   Sample Input ...

  6. [BZOJ4260]Codechef REBXOR(Trie)

    Trie模板题.求出每个前缀和后缀的最大异或和区间,枚举断点就可.不知为何跑得飞快. #include<cstdio> #include<cstring> #include&l ...

  7. [Bzoj4260]Codechef REBXOR(trie树)

    4260: Codechef REBXOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1534  Solved: 669[Submit][Stat ...

  8. bzoj4260 REBXOR——Trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4260 对于每个位置,求一个前缀最大值和后缀最大值: 也就是从1到 i 的异或和要找前面某处的 ...

  9. BZOJ 4260: Codechef REBXOR( trie )

    求出前缀和, 那么以第x个元素结尾的最大异或值是max(sumx^sump)(1≤p<x), 用trie加速. 后缀同理, 然后扫一遍就OK了.时间复杂度O(31N) ------------- ...

随机推荐

  1. hdu 3861 The King’s Problem

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  2. UI与数据分离 与 UI的演进

    解藕的好处:UI内部模块能够灵活的变化. MVC或者三层架构着重强调了数据.业务逻辑和UI的分离. (MVC中的C只是UI和业务逻辑模块间的一个中转组件,理论上应该是个轻模块.) 以前的关注的解藕技术 ...

  3. [OpenMP] 并行计算入门

    OpenMP并行计算入门 个人理解 OpenMP是一种通过共享内存并行系统的多处理器程序设计的编译处理方案,通过预编译指令告诉编译器哪些代码块需要被并行化,通过拷贝代码块实现并行程序.对于循环的并行化 ...

  4. FiraCode 字体 => 箭头函数变成 整体 还有 等于 不等于

    https://github.com/tonsky/FiraCode Enable in Settings → Editor → Color Scheme → Color Scheme Font →  ...

  5. 2018.5.14 PHP基础学习

    1.使用PHP输出HTML 使用PHP输出一个表格,并且通过style标签改变字体 <!--思考与练习--> <style type="text/css"> ...

  6. 为什么方差的分母有时是n,有时是n-1 源于总体方差和样本方差的不同

    为什么样本方差(sample variance)的分母是 n-1? 样本方差计算公式里分母为n-1的目的是为了让方差的估计是无偏的.无偏的估计(unbiased estimator)比有偏估计(bia ...

  7. c++作业:求N的阶乘。

    N的阶乘就是n.(n-1)! 5的阶乘是什么?5*4*3*2*1 #include <iostream> using namespace std; int jiecheng(int num ...

  8. Pig Latin-freecodecamp算法题目

    Pig Latin 1.要求 Pig Latin把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 "ay". 如果单词以元音开始,你只 ...

  9. Github使用技巧总结

    <config> PyCharm与GitHub配置使用总结 <readme> 在github的readme添加图片 github readme写法 GitHub上README. ...

  10. 【二分 最大流】bzoj1532: [POI2005]Kos-Dicing

    晚上果然不适合调题目 Description Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出 ...