【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙)
这个就是正反做一遍最大异或和更新答案
最大异或就是很经典的可持久化Trie,从高到低贪心
WA: val&(1<<(base-1))得到的并不直接是1/0
#include<bits/stdc++.h>
#define ll long long
#define N 400005
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,tot,a[N],rt[N],ch[N*][];
int ans,now,lmx[N],rmx[N];
void build(int &x,int base){
x=++tot;
if(base==-)return;
build(ch[x][],base-);
}
int getmx(int x,int base,int val){
if(!base)return ;
int t=val&(<<(base-));t?t=:t=;
if(ch[x][t]){return (<<(base-))+getmx(ch[x][t],base-,val);}
else return getmx(ch[x][t^],base-,val);
}
void add(int pre,int &x,int base,int val){
x=++tot;
ch[x][]=ch[pre][];ch[x][]=ch[pre][];
if(base==-)return;
int t=val&(<<(base-));t?t=:t=;
add(ch[pre][t],ch[x][t],base-,val);
}
int main(){
n=read();
for(int i=;i<=n;i++)a[i]=read();
now=;tot=;
build(rt[],);
for(int i=;i<=n;i++){
rt[i]=rt[i-];
now^=a[i];
lmx[i]=getmx(rt[i-],,now);
add(rt[i-],rt[i],,now);
}
for(int i=;i<=n;i++)lmx[i]=max(lmx[i],lmx[i-]);
now=;tot=;
memset(ch,,sizeof(ch));
build(rt[],);
for(int i=n;i;i--){
now^=a[i];
rmx[i]=getmx(rt[i+],,now);
add(rt[i+],rt[i],,now);
}
for(int i=n;i;i--)rmx[i]=max(rmx[i],rmx[i+]);
for(int i=;i<n;i++)ans=max(ans,lmx[i]+rmx[i+]);
printf("%d\n",ans);
}
4260: Codechef REBXOR
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 461 Solved: 206
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 3 1 2
Sample Output
HINT
【BZOJ4260】 Codechef REBXOR 可持久化Trie的更多相关文章
- bzoj 4546: codechef XRQRS [可持久化Trie]
4546: codechef XRQRS 可持久化Trie codechef上过了,bzoj上蜜汁re,看别人说要开5.2e5才行. #include <iostream> #includ ...
- [Bzoj4260]Codechef REBXOR(trie树)
4260: Codechef REBXOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1534 Solved: 669[Submit][Stat ...
- BZOJ4260 Codechef REBXOR 题解
题目大意: 有一个长度为n的序列,求1≤l1≤r1<l2≤r2≤n使得(⊕r1i=l1ai)+(⊕r2i=l2ai)最大,输出这个最大值. 思路: 用Trie求出前缀异或和以及后缀异或和,再求出 ...
- [BZOJ4260]Codechef REBXOR(Trie)
Trie模板题.求出每个前缀和后缀的最大异或和区间,枚举断点就可.不知为何跑得飞快. #include<cstdio> #include<cstring> #include&l ...
- BZOJ4260 Codechef REBXOR(trie)
用trie求出前缀最大区间异或和.后缀最大区间异或和即可.注意空间是nlog的. #include<iostream> #include<cstdio> #include< ...
- BZOJ4260: Codechef REBXOR
Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output 输出一行包含给定表达式可能的最大值. S ...
- BZOJ4260: Codechef REBXOR (01Tire树)
题意 题目链接 Sol 首先维护出前缀xor和后缀xor 对每个位置的元素插入到Trie树里面,每次找到和该前缀xor起来最大的元素 正反各做一遍,取最大. 记得要开log倍空间qwq.. #incl ...
- [BZOJ4260] Codechef REBXOR (01字典树,异或前缀和)
Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,-,AN. Output 输出一行包含给定表达式可能的最大值. Sample ...
- 【BZOJ4260】Codechef REBXOR (Trie树)
[BZOJ4260]Codechef REBXOR (Trie树) 题面 BZOJ 题解 两眼题.第一眼不会做,第二眼好简单... 前缀异或和一下,拿\(Trie\)树维护求一个在这个端点以左的最大值 ...
随机推荐
- 设计工具 -uml
- 优秀的API接口设计原则及方法(转)
一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...
- 在windows系统的文件右键菜单中增加“命令提示符”
本实用小工具能够在windows系统的文件右键菜单中增加“命令提示符”,方便快速进入制定文件的命令提示窗口,避免逐层输入或复制文件夹路径,极其实用. 工具下载地址如下:360云盘(访问密码:5b71) ...
- commonlisp教程以及学习笔记-01
手上有两个教程,但是感觉这个教程可能更适合自己
- 枚举PEB获取进程模块列表
枚举进程模块的方法有很多种,常见的有枚举PEB和内存搜索法,今天,先来看看实现起来最简单的枚举PEB实现获取进程模块列表. 首先,惯例是各种繁琐的结构体定义.需要包含 ntifs.h 和 WinDef ...
- Maven项目在Eclipse中调试 Debug
废话不说一路跟图走. 断点会进入到如下页面点击Edit Source Lookup Path 如下图操作 成功进入Debug模式
- Console.log,Window.alert,Document.write三者区别
1.Console.log不会阻断程序继续进行,在控制台可以看到测试结果. 2.Window.alert弹出框会阻断程序运行,在弹出框可以看到测试结果. 3.Document.write不会阻断程序继 ...
- log4j.xml 日志只输出指定类配置
1.日志增加appender 指定日志生成时间.格式.间隔时间. 2.category指定哪些或哪个类日志生成在文件中. 3.自定义logger避免不要将userBehavior定义到root中避免继 ...
- Java数组课后作业
1.运行TestArrays.java,了解Arrays中的一些重要方法的用法. Arrays.equals(a 1, a2):判断数组是否相等. int[] b = Arrays.copyOf(a, ...
- hdu 3518 Boring counting 后缀数组基础题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...