Input
输入数据的第一行包含一个整数N,表示数组中的元素个数。
第二行包含N个整数A1,A2,…,AN。
Output
输出一行包含给定表达式可能的最大值。
Sample Input
5
1 2 3 1 2
Sample Output
6
Hint
满足条件的(l1,r1,l2,r2)有:(1,2,3,3),(1,2,4,5),(3,3,4,5)。

对于100%的数据,2 ≤ N ≤ 4*105,0 ≤ Ai ≤ 109。
做了几个求区间异或最大的题目。求区间异或最大就是求个前缀,然后就是普通的01字典树了。
就像这个题目,求两个不相交的区间,然后两个区间的异或和最大。
我们想求一个前缀区间异或最大值并且记录下来存到数组中,然后再去枚举后缀的区间,再去更新最大值。
代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#define ll long long
using namespace std;const int maxx=4e5+100;
struct node{int trie[2];int num;
}p[maxx*33];
int sum[maxx],pre[maxx];
int a[maxx],dp[maxx];
int n,tot;inline void Insert(int x)
{int root=0;int id;for(int i=32;i>=0;i--){id=(x>>i)&1;if(!p[root].trie[id]) p[root].trie[id]=++tot;root=p[root].trie[id];}p[root].num=x;
}
inline int Find(int x)
{int root=0;int id;for(int i=32;i>=0;i--){id=(x>>i)&1;if(p[root].trie[id^1]) root=p[root].trie[id^1];else root=p[root].trie[id];}return p[root].num^x;
}
int main()
{while(scanf("%d",&n)!=EOF){tot=0;for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) sum[i]=sum[i-1]^a[i];//前缀for(int i=n;i>=1;i--) pre[i]=pre[i+1]^a[i];//后缀Insert(0);for(int i=1;i<=n;i++){dp[i]=max(dp[i-1],Find(sum[i]));Insert(sum[i]);}int _max=0;for(int i=n;i>=1;i--){_max=max(_max,Find(pre[i])+dp[i-1]);//枚举后缀区间异或最大值再加上前面求过的前缀,他们的和去更新最大值Insert(pre[i]);}printf("%d\n",_max);}return 0;
}

努力加油a啊,(o)/~

Codechef REBXOR HYSBZ - 4260(01字典树+区间异或最大)相关推荐

  1. CodeForeces 842d Vitya and Strange Lesson ——(带lazy标记的01字典树)

    给一个序列,每次操作对这个序列中的所有数异或一个x,问每次操作完以后整个序列的mex值. 做法是去重后构建01字典树,异或x就是对root加一个x的lazy标志,每次pushDown时如果lazy的这 ...

  2. 【HDOJ6955】Xor sum(异或前缀和,01字典树)

    1006 Xor sum 题意: 给出一个长度为n的序列,求一个最短连续子序列满足异或和大于等于k.n<1e5. 思路: 参考CF665E,求序列a中有多少个异或和大于等于k的子序列,枚举所有的 ...

  3. hdu5296 01字典树

    根据二进制建一棵01字典树,每个节点的答案等于左节点0的个数 * 右节点1的个数 * 2,遍历整棵树就能得到答案. AC代码: #include<cstdio> using namespa ...

  4. Beautiful Subarrays (01字典树 瞎搞)

    题意: 题解: 一看问的是子序列,并且还是异或. 首先想到01字典树,再一看让你求子序列的个数,大致是想让你把这个序列进行前缀异或处理后然后再01字典树上进行操作吧. 假设01字典树往左边是0右边是1 ...

  5. 奶牛异或(01字典树)

    题意: 让你找一个连续区间异或和最大,如果有相同的,则输出断点较小的. 题解: 01字典树,利用前缀和的思想进行求解,我们在插入前缀的同时,也在不断的更新最大值. 我们查询当前 二进制字符串与已经插入 ...

  6. hdu-4825(01字典树)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  7. zcmu-1783(01字典树)

    1783: 秋实大哥与快餐店 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 78  Solved: 12 [Submit][Status][Web B ...

  8. HDU4825 Xor Sum 01字典树(Tire Tree)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  9. codeforces 842 D. Vitya and Strange Lesson(01字典树+思维+贪心)

    题目链接:http://codeforces.com/contest/842/problem/D 题解:像这种求一段异或什么的都可以考虑用字典树而且mex显然可以利用贪心+01字典树,和线段树差不多就 ...

最新文章

  1. tensorflow max_pooling
  2. 第十七天:规划沟通管理
  3. Oracle分组函数
  4. 安装了vmware tools后,自动调整大小-自动适应客户机仍为灰色(终极解决方案)
  5. 安卓开发之开启子线程以及安卓的消息机制原理
  6. mybatisplus高效批量更新_重磅!易赚更新超强功能,助力企业精准推送,提升转化率!...
  7. 基于AWT、Swing的GUI编程 - 多个命令共享同一个监听器类
  8. Yann LeCun提出首个多模态高性能自监督算法,语音、图像文本全部SOTA
  9. DLUTOJ 1033 Matrix
  10. java helloworld源代码_Java Hello World源代码剖析
  11. 如何使打印出手写字体
  12. 数据库原理实验六——ODBC/JDBC数据库编程
  13. 阿里云的ACP认证与ACE认证含金量高吗?
  14. Mbps和MB/s之间的换算
  15. iphone震动反馈怎么设置_苹果魅族都在用的震动反馈 到底是怎样实现的?
  16. 矩阵分析与应用-1.8-广义逆矩阵
  17. CodeLite开发Gtk 语法检查报错
  18. 太真实,北上广深年薪20W、30W、40W的程序员的生活状态!
  19. 后浪HTML5推前浪Flash:2020,为何大家都不支持Flash了?
  20. ERP编制物料清单 基础

热门文章

  1. Swift5以及IOS15对于二维码的使用
  2. ztree 更新配置后重新渲染树_【问】zTree异步加载时添加父节点怎样避免再次加载整树...
  3. 逻辑漏洞——会话管理问题
  4. python脚本根据cookies自动登录网站_Python爬虫如何使用Cookies登录网站
  5. css 一行显示_CSS笔记1
  6. 上海找python工作容易吗_Python程序员去上海工作有多难?
  7. java序列化_夯实Java基础系列22:一文读懂Java序列化和反序列化
  8. mysql 命名 冲突_MySQL中字段名和保留字冲突的解决办法
  9. 腾讯 Omi 团队发布 mps - 原生小程序插上 JSX 、Less 和 Cloud 的翅膀
  10. Jmeter中使用循环如何保证数据不重复