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 ...
随机推荐
- Logistic Regression 用于预测马是否生病
1.利用Logistic regression 进行分类的主要思想 根据现有数据对分类边界线建立回归公式,即寻找最佳拟合参数集,然后进行分类. 2.利用梯度下降找出最佳拟合参数 3.代码实现 # -* ...
- dynamic和nullable一起使用时的注意
dynamic和nullable一起使用时的注意
- ios7适配--navgationbar遮住下面view的处理
3down votefavorite Have you guys stumbled up on this issue ? Basically in iOS 7 Navigation Control ...
- py_initialize:C调Python出错 是初始化错误?
还是pythonpath和pythonname变量没有配置正确? py_initialize()方法是什么? In an application embedding Python, this shou ...
- 【Android学习】Android编码规范
四种常见的命名法 比较Java和c#的命名规范的不同点 常量用大写 java方法首字母不大写,应该小写 函数行数限制 不要用拼音 参照物,Android源码 看源码工具,SourceInsight 和 ...
- MongoDB整理笔记の高级查询
1.条件操作符 <, <=, >, >= 这个操作符就不用多解释了,最常用也是最简单的 db.collection.find({ "field" : ...
- Redis缓存穿透、缓存雪崩
缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义. ...
- 模拟Springboot二:内置tomcat
既然要将tomcat内置到项目中,并且能够成功的启动项目就要知道 tomcat 做了哪些事情 ,那么就必须先搞明白 一个 普通的web项目是如何被我们本地配置的tomcat启动并运行的 (1). 先 ...
- 比较php字符串连接的效率
php字符串连接有三种方式 1)使用 . 链接 2)使用 .= 连接 3)implode 函数连接数组元素 /*以下测试在ci框架进行*/ private function get_mcrotime( ...
- sklearn的train_test_split函数
train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签. from sklearn.model_selection import ...