BZOJ - 4260 01字典树+前后缀
题意:给定\(a[1...n]\),求\((a_i⊕a_i+1⊕...⊕a_j)+(a_p⊕a_{p+1}⊕...⊕a_{q})\)的最大值,其中\(1≤i≤j<p≤q≤n\)
前后缀最优解预处理后然后枚举断点即可
/*H E A D*/
struct trie{
int ch[maxn<<5][2],sz[maxn<<5],val[maxn<<5],tot,root;
void init(){
ch[0][0]=ch[0][1]=0;
sz[0]=0;val[0]=0;
tot=1;root=0;
}
void insert(int x){
int c,now=root;
for(int k = 30; k >= 0; k--){
c=((x>>k)&1);
if(!ch[now][c]){
ch[tot][0]=ch[tot][1]=0;
sz[tot]=0;val[tot]=0;
ch[now][c]=tot++;
}
now=ch[now][c];
sz[now]++;
}
val[now]=x;
}
void update(int x,int d){
int c,now=root;
for(int k = 30; k >= 0; k--){
c=((x>>k)&1);
now=ch[now][c];
sz[now]+=d;
}
}
int query(int x){
int c,now=root;
for(int k = 30; k >= 0; k--){
c=((x>>k)&1);
if(ch[now][c^1]&&sz[ch[now][c^1]]) now=ch[now][c^1];
else now=ch[now][c];
}
return x^val[now];
}
}trie;
int n,ans,a[maxn],pre[maxn],suf[maxn],mpre[maxn],msuf[maxn];
int main(){
while(scanf("%d",&n)!=EOF){
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
pre[0]=suf[n+1]=0;
for(int i = 1; i <= n; i++){
pre[i]=pre[i-1]^a[i];
}
for(int i = n; i > 0; i--){
suf[i]=suf[i+1]^a[i];
}
memset(mpre,0,sizeof mpre);trie.init();trie.insert(0);
for(int i = 1; i <= n; i++){
mpre[i]=max(mpre[i-1],trie.query(pre[i-1]));
trie.insert(pre[i]);
}
memset(msuf,0,sizeof msuf);trie.init();trie.insert(0);
// for(int i = n; i > 0; i--){
// msuf[i]=max(msuf[i+1],trie.query(suf[i+1]));
// trie.insert(suf[i]);
// }
// ans=0;
// for(int i = n; i > 0; i--){
// ans=max(ans,msuf[i]+mpre[i-1]);
// }
for(int i = n ; i > 0; i--){
ans=max(ans,trie.query(suf[i])+mpre[i-1]);
trie.insert(suf[i]);
}
printf("%d\n",ans);
}
return 0;
}
BZOJ - 4260 01字典树+前后缀的更多相关文章
- 字典树基础进阶全掌握(Trie树、01字典树、后缀自动机、AC自动机)
字典树 概述 字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它 ...
- BZOJ 4260 Codechef REBXOR (区间异或和最值) (01字典树+DP)
<题目链接> 题目大意:给定一个序列,现在求出两段不相交的区间异或和的最大值. 解题分析: 区间异或问题首先想到01字典树.利用前缀.后缀建树,并且利用异或的性质,相同的两个数异或变成0, ...
- [BZOJ4260] Codechef REBXOR (01字典树,异或前缀和)
Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,-,AN. Output 输出一行包含给定表达式可能的最大值. Sample ...
- Codeforces Round #367 (Div. 2)---水题 | dp | 01字典树
A.Beru-taxi 水题:有一个人站在(sx,sy)的位置,有n辆出租车,正向这个人匀速赶来,每个出租车的位置是(xi, yi) 速度是 Vi;求人最少需要等的时间: 单间循环即可: #inclu ...
- 字典树&&01字典树专题&&对字典树的理解
对于字典树和01字典树的一点理解: 首先,字典树建树的过程就是按照每个数的前缀来的,如果你要存储一个全小写字母字符串,那么这个树每一个节点最多26个节点,这样的话,如果要找特定的单词的话,按照建树的方 ...
- CodeForeces 842d Vitya and Strange Lesson ——(带lazy标记的01字典树)
给一个序列,每次操作对这个序列中的所有数异或一个x,问每次操作完以后整个序列的mex值. 做法是去重后构建01字典树,异或x就是对root加一个x的lazy标志,每次pushDown时如果lazy的这 ...
- Chip Factory---hdu5536(异或值最大,01字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题意:有一个数组a[], 包含n个数,从n个数中找到三个数使得 (a[i]+a[j])⊕a[k] ...
- Xor Sum---hdu4825(01字典树模板)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4825 题意:有n个数m个查找,每个查找有一个数x, 从序列中找到一个数y,使得x异或y最大 ...
- hdu5296 01字典树
根据二进制建一棵01字典树,每个节点的答案等于左节点0的个数 * 右节点1的个数 * 2,遍历整棵树就能得到答案. AC代码: #include<cstdio> using namespa ...
随机推荐
- Net-tools
一.简介 Net-tools 包含如下程序,构成了 Linux 网络的基础. arp用来操作核心的ARP(地址解析协议)的高速缓存,通常用来增加.删除一个条目以及转储ARP高速缓存. dnsdomai ...
- 使用mail架包发送邮件javax.mail.AuthenticationFailedException: failed to connect at javax.mail.Service.connec
这个错误是因为连接不上邮箱服务器导致的,可能有以下几个原因(以网易邮箱为例) 1.当使用第三方登录邮箱时需要有邮箱的授权码,且要开启POP3/SMTP/IMAP:服务 2.在代码中要调用网易邮箱的密码 ...
- 10、差异基因topGO富集
参考:http://www.biotrainee.com/thread-558-1-1.html http://bioconductor.org/packages/3.7/bioc/ http://w ...
- jQuery 2.1.4版本的源码分析
jQuery 2.1.4版本的源码分析 jquery中获取元素的源码分析 jQuery.each({// 获取当前元素的父级元素 parent: function(elem) { var parent ...
- rpm遇到的坑-与VMP冲突
rpm遇到的坑-与VMP冲突 摘自:https://blog.csdn.net/shijichao2/article/details/78797586 2017年12月13日 22:29:21 阅读数 ...
- [GO]数组指针做函数参数
package main import "fmt" //p指向实现数组a,它是指向数组,它是数组指针//*p指向指针指向的内存,就是实参a func modify1(p *[]in ...
- Linux下面rpm命令和mount命令详解
在Linux下面我们经常会安装一些软件包,还有挂载命令.接下来,我们通过一些实例来演示这些命令的使用.. 第一步:我们先在linux下面挂载光盘,先进入到根目录,然后切换到根下面的/mnt目录,因为/ ...
- c++基本
要投身游戏业了,自学cocos2d-x之前准备把c++的基础再捡起来 基本语法 1. cout<<"hello world"; 2. 开头写 #include < ...
- 将“100px” 转换为100
parseInt("100px") //结果是100
- bitbucket使用教程
Bitbucket使用说明: 使用者请直接看第一步,第二步和egit使用说明, 需要自己创建仓库的可以看三四步 第一步:新用户注册 bitbucket.org 然后按步骤创建一个教程代码库 可以选择下 ...