P4735 最大异或和 01 Trie
题目描述
给定一个非负整数序列 \(\{a\}\),初始长度为\(n\)。
有 \(m\) 个操作,有以下两种操作类型:
\(A\ x\):添加操作,表示在序列末尾添加一个数 \(x\),序列的长度 \(n+1\)。
\(Q\ l\ r\ x\):询问操作,你需要找到一个位置 \(p\),满足\(l \le p \le r\),使得: \(a[p] \oplus a[p+1] \oplus ... \oplus a[N] \oplus x\)最大,输出最大是多少。
输入格式
第一行包含两个整数 \(N,M\),含义如问题描述所示。
第二行包含 \(N\)个非负整数,表示初始的序列 \(A\) 。
接下来 \(M\) 行,每行描述一个操作,格式如题面所述。
输出格式
假设询问操作有 \(T\) 个,则输出应该有 \(T\) 行,每行一个整数表示询问的答案。
输入输出样例
输入 #1
5 5
2 6 4 3 6
A 1
Q 3 5 4
A 4
Q 5 7 0
Q 3 6 6
输出 #1
4
5
6
说明/提示
对于测试点 \(1−2\),\(N,M \le 5\)。
对于测试点 \(3−7\),\(N,M \le 80000\)。
对于测试点 \(8−10\),\(N,M \le 300000\)。
其中测试点 \(1,3,5,7,9\)保证没有修改操作。
\(0 \le a[i] \le 10^7\)。
分析
其实这题的 \(Trie\) 树可以不用可持久化
因为前缀会有一些奇奇怪怪的特判,所以我的 \(Trie\) 树里存的是后缀
要满足 \(a[p]\ xor\ a[p+1]\ xor ... xor\ a[N]\ xor\ x\) 最大
不妨设后缀异或和为 \(sum\)
那么就有 $ \sum_{i=p}^N sum[i]\ xor\ x$ 最大
单次操作可以用 \(Trie\) 树 实现
对于多组询问,我们只需要按照每一次询问的右端点从小到大离线排序即可
对于左端点,我们记录一下在 \(Trie\) 树中这个节点最晚在哪一次操作中被加入即可
常数比可持久化 \(Trie\) 树小不少,目前是最优解
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rg register
inline int read(){
rg int x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
const int maxn=6e5+5,maxk=34;
int a[maxn],sum[maxn],n,m,ans[maxn],cnt,top;
char s[maxn];
struct asd{
int l,r,id,val;
}b[maxn];
bool cmp(asd aa,asd bb){
return aa.r<bb.r;
}
int tr[maxn*10][2],mmax[maxn*10][2];
void ad(rg int val,rg int id){
rg int now=0;
for(rg int i=30;i>=0;i--){
rg int k=(val>>i)&1;
if(!tr[now][k]){
tr[now][k]=++cnt;
mmax[now][k]=id;
} else {
mmax[now][k]=std::max(mmax[now][k],id);
}
now=tr[now][k];
}
}
int cx(rg int val,rg int id){
rg int now=0,nans=0;
for(rg int i=30;i>=0;i--){
rg int k=(val>>i)&1;
if(tr[now][k^1] && mmax[now][k^1]>=id){
now=tr[now][k^1];
nans+=(1<<i);
} else {
now=tr[now][k];
}
}
return nans;
}
int main(){
n=read(),m=read();
for(rg int i=1;i<=n;i++){
a[i]=read();
}
rg int aa,bb,cc;
for(rg int i=1;i<=m;i++){
scanf("%s",s);
if(s[0]=='A'){
aa=read();
a[++n]=aa;
} else {
aa=read(),bb=read(),cc=read();
top++;
b[top].l=aa,b[top].r=bb,b[top].val=n,b[top].id=cc;
}
}
for(rg int i=n;i>=1;i--){
sum[i]=sum[i+1]^a[i];
}
for(rg int i=1;i<=top;i++){
b[i].val=sum[b[i].val+1]^b[i].id;
b[i].id=i;
}
std::sort(b+1,b+1+top,cmp);
rg int head=1;
for(rg int i=1;i<=top;i++){
while(head<=b[i].r){
ad(sum[head],head);
head++;
}
ans[b[i].id]=cx(b[i].val,b[i].l);
}
for(rg int i=1;i<=top;i++){
printf("%d\n",ans[i]);
}
return 0;
}
P4735 最大异或和 01 Trie的更多相关文章
- CSU 1216异或最大值 (0-1 trie树)
Description 给定一些数,求这些数中两个数的异或值最大的那个值 Input 多组数据.第一行为数字个数n,1 <= n <= 10 ^ 5.接下来n行每行一个32位有符号非负整数 ...
- hdu 4825 Xor Sum (01 Trie)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题面: Xor Sum Time Limit: 2000/1000 MS (Java/Others) ...
- [TJOI2018] Xor 异或 (可持久化Trie,树链剖分)
题目描述 现在有一颗以 1 为根节点的由 n 个节点组成的树,树上每个节点上都有一个权值 \(v_i\).现在有 Q 次操作,操作如下: 1 x y :查询节点 x 的子树中与 y 异或结果的最大值. ...
- [一本通学习笔记] 字典树与 0-1 Trie
字典树中根到每个结点对应原串集合的一个前缀,这个前缀由路径上所有转移边对应的字母构成.我们可以对每个结点维护一些需要的信息,这样即可以去做很多事情. #10049. 「一本通 2.3 例 1」Phon ...
- 可持久化0-1 Trie 简介
Trie树是字符串问题中应用极为广泛的一种数据结构,可以拓展出AC自动机.后缀字典树等实用数据结构. 然而在此我们考虑0-1 Trie的应用,即在序列最大异或问题中的应用. 这里的异或是指按位异或.按 ...
- 洛谷 P4735 最大异或和 解题报告
P4735 最大异或和 题目描述 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的 ...
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- 可持久化+Trie || BZOJ 3261最大异或和 || Luogu P4735 最大异或和
题面:最大异或和 代码: #include<cstdio> #include<cstring> #include<iostream> using namespace ...
- P4735 最大异或和 /【模板】可持久化Trie
//tire的可持久化 //线段树的可持久化——主席树 //可持久化的前提:本身的拓扑结构在操作时不变 //可以存下来数据结构的所有历史版本 //核心思想:只记录每一个版本与前一个版本不一样的地方 / ...
随机推荐
- 【PUPPETEER】初探之元素获取(二)
一.涉及的知识点 如何使用css selector 常用元素获取 $ 元素选择 type (api 输入) click (api 点击) 二.学习网址 https://github.com/Googl ...
- centos 7 安装zabbix-4.0
第一步:安装nginx ############安装Nginx###########yum localinstall http://nginx.org/packages/centos/7/noarch ...
- JAVA面试宝典分享
JAVA面试宝典分享 前言 面试题 Java面试题(上) Java面试题(中) Java面试题(下) 参考答案 其他补充内容: 项目经验 项目介绍 项目开发流程 项目管理 系统架构 第三方工具(插件) ...
- 【linux】系统调用版串口分析&源码实战
目录 前言 参考 1. 实战分析 1.1 开发步骤 1.1.1 获取串口设备路径 1.1.2 打开设备文件 1.1.3 配置串口 termios 结构体 1. c_iflag 输入模式标志 2. c_ ...
- csust T1097 “是时候表演真正的技术了” 题解(虚点跑最短路)
题目链接 题目大意 给你n个点m条路,以及k个宝藏点,q次查询要你求出距离这个点最近的宝藏点的距离 题目思路 一个套路题,建立虚点与k个点连一个权值为0的边,跑最短路即可 注意边多了4000条 代码 ...
- 牛客练习赛69 火柴排队 题解(dp)
题目链接 题目大意 给你一个长为n(n<=5e3)的数组a.随机使得k个元素增加d.要你求多大的概率使得,这些数组元素的相对大小不发生改变 输出 n 行每行一个整数,第 i 行的整数表示 k=i ...
- .Net Core官方的 JWT 授权验证
什么是JWT? JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象.由于此信息是经过数字签名的,因此可以被验 ...
- 如何有效恢复误删的HDFS文件
HDFS是大数据领域比较知名的分布式存储系统,作为大数据相关从业人员,每天处理HDFS上的文件数据是常规操作.这就容易带来一个问题,实际操作中对重要数据文件的误删,那么如何恢复这些文件,就显得尤为重要 ...
- mySQL入门之多表操作
外键 初识外键 外键:引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束.(外键用于建立和加强两个表数据之间的连接,保证数据的完整和统一性) 主表:被引用的表 从表:引用外键的表 -- ...
- 第7.7节 案例详解:Python类继承机制
本节实现一个类继承的小程序,下面一边结合代码一边介绍相关继承的知识.例子以车.汽车为例,车为父类.汽车为子类. 一. 定义父类Vehicle class Vehicle(): def __ ...