题目描述

给定一个非负整数序列 \(\{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的更多相关文章

  1. CSU 1216异或最大值 (0-1 trie树)

    Description 给定一些数,求这些数中两个数的异或值最大的那个值 Input 多组数据.第一行为数字个数n,1 <= n <= 10 ^ 5.接下来n行每行一个32位有符号非负整数 ...

  2. hdu 4825 Xor Sum (01 Trie)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题面: Xor Sum Time Limit: 2000/1000 MS (Java/Others) ...

  3. [TJOI2018] Xor 异或 (可持久化Trie,树链剖分)

    题目描述 现在有一颗以 1 为根节点的由 n 个节点组成的树,树上每个节点上都有一个权值 \(v_i\).现在有 Q 次操作,操作如下: 1 x y :查询节点 x 的子树中与 y 异或结果的最大值. ...

  4. [一本通学习笔记] 字典树与 0-1 Trie

    字典树中根到每个结点对应原串集合的一个前缀,这个前缀由路径上所有转移边对应的字母构成.我们可以对每个结点维护一些需要的信息,这样即可以去做很多事情. #10049. 「一本通 2.3 例 1」Phon ...

  5. 可持久化0-1 Trie 简介

    Trie树是字符串问题中应用极为广泛的一种数据结构,可以拓展出AC自动机.后缀字典树等实用数据结构. 然而在此我们考虑0-1 Trie的应用,即在序列最大异或问题中的应用. 这里的异或是指按位异或.按 ...

  6. 洛谷 P4735 最大异或和 解题报告

    P4735 最大异或和 题目描述 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的 ...

  7. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

  8. 可持久化+Trie || BZOJ 3261最大异或和 || Luogu P4735 最大异或和

    题面:最大异或和 代码: #include<cstdio> #include<cstring> #include<iostream> using namespace ...

  9. P4735 最大异或和 /【模板】可持久化Trie

    //tire的可持久化 //线段树的可持久化——主席树 //可持久化的前提:本身的拓扑结构在操作时不变 //可以存下来数据结构的所有历史版本 //核心思想:只记录每一个版本与前一个版本不一样的地方 / ...

随机推荐

  1. 必须掌握的Spark调优技术点

    在利用Spark处理数据时,如果数据量不大,那么Spark的默认配置基本就能满足实际的业务场景.但是当数据量大的时候,就需要做一定的参数配置调整和优化,以保证业务的安全.稳定的运行.并且在实际优化中, ...

  2. LaTeX中的数学公式之多行公式

    多行公式的代码及注释: 显示效果:

  3. 多k8s集群管理

    多集群的切换是K8s运维中比不可少的问题,常见的基于多个集群进行切换的方法有三种: 切换config文件 通过context进行集群切换 用kubecm进行集群切换 切换config文件 我们先看看放 ...

  4. 避开一部分安装问题的Burpsuite的安装教程

    Burpsuite的安装教程 前言: 既然网上有很多的Burpsuite的安装教程为什么笔者还要在写这篇文章呢? 笔者发现网上的许多安装教程都存在着许许多多的问题,有时候对于一些安装细节描述不是很深, ...

  5. Python学习随笔:使用xlwings读取和操作Execl文件的数字需要注意的问题

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在使用xlwings读取Excel文件中的数据时,所有的数字不论是整数.浮点数还是文本存放的数字,在 ...

  6. PyQt学习随笔:重写组件的event方法捕获组件的事件

    在PyQt的组件对象中,都有从QWidget中继承的方法event,而QWidget.event是对QObject类定义的虚拟方法event的实现. event方法的语法: bool event(QE ...

  7. CNVD漏洞证书(1)

    之前申请了CNVD原创漏洞,踩了坑,记录一下 有很多师傅写过相关的文章: https://blog.csdn.net/qq1124794084/article/details/82657840 htt ...

  8. CSS常用语法缩写

    使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.CSS常用语法缩写的主要规则如下: 颜色 16进制的色彩值,如果每两位的值相同,可以缩写一半,例如:#000000可以缩写为#000;#33669 ...

  9. 【题解】G.Graph(2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest)

    题目链接G题 题意 序列 \(a_1,a_2,⋯,a_n\) 是一个排列, 当且仅当它含有 1 到 n 的所有整数. 排列 \(a_1,a_2,⋯,a_n\) 是一个有向图的拓扑排序,当且仅当对于每条 ...

  10. (window)Docker的镜像使用

    镜像加速 镜像默认是通过 DockerHub 拉取的,国内可能有些困难,会报以下错误: net/http: TLS handshake timeout 所以,需要配置国内的加速服务地址: 官方地址:h ...