Description

给定一个非负整数序列\(\{a\}\),初始长度为\(N\)。

有\(M\)个操作,有以下两种操作类型:

  1. A x:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N+1\)。
  2. Q l r x:询问操作,你需要找到一个位置\(p\),满足\(l \leq p \leq r\),使得: \(a[p] \oplus a[p+1] \oplus ... \oplus a[N] \oplus x\) 最大,输出最大是多少。

Input

第一行包含两个整数 \(N,M\),含义如问题描述所示。

第二行包含 \(N\)个非负整数,表示初始的序列\(A\) 。

接下来 \(M\)行,每行描述一个操作,格式如题面所述。

Output

假设询问操作有 \(T\) 个,则输出应该有 \(T\) 行,每行一个整数表示询问的答案。

表示是个裸的可持久化\(01Trie\)树.

考虑到\(\oplus\)具有的性质\((x\ \oplus \ y) \oplus y=x\)

所以我们最终所求就是$sum[p-1]\oplus sum[n] \oplus x $

(其中\(sum\)数组存储异或前缀和.)

想要求出最大值.我们显然已知\(sum[n] \oplus x\)

则要在\([l,r]\)中找出与\(sum[n]\oplus x\)异或起来的最大值。

显然直接查询即可.

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#define R register using namespace std; const int maxn=600009; inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
} struct Trie
{
int ch[maxn*35][2],cnt[maxn*35],tot,root[maxn];
Trie(){root[0]=tot=1;}
inline void insert(R int lastroot,R int &nowroot,int x)
{
nowroot=++tot;
int u=nowroot;
for(R int i=30;~i;i--)
{
R int bit=(x>>i)&1;
ch[u][!bit]=ch[lastroot][!bit];
ch[u][bit]=++tot;
u=ch[u][bit];
lastroot=ch[lastroot][bit];
cnt[u]=cnt[lastroot]+1;
}
} inline int query(R int l,R int r,R int x)
{
R int res=0;
for(R int i=30;~i;i--)
{
R int bit=(x>>i)&1;
if(cnt[ch[r][!bit]]-cnt[ch[l][!bit]])
{
l=ch[l][!bit];
r=ch[r][!bit];
res+=(1<<i);
}
else
{
l=ch[l][bit];
r=ch[r][bit];
}
}
return res;
}
}se; int n,m,sum[maxn],a[maxn]; char opt[5]; int main()
{
in(n),in(m);n++;
for(R int i=2,x;i<=n;i++)in(a[i]);
for(R int i=1;i<=n;i++)sum[i]=sum[i-1]^a[i];
for(R int i=1;i<=n;i++)
se.insert(se.root[i-1],se.root[i],sum[i]);
for(R int x,y,z;m;m--)
{
scanf("%s",opt+1);
if(opt[1]=='A')
{
in(x);n++;
sum[n]=sum[n-1]^x;
se.insert(se.root[n-1],se.root[n],sum[n]);
}
else
{
in(x),in(y),in(z);
printf("%d\n",se.query(se.root[x-1],se.root[y],sum[n]^z));
}
}
}

可持久化01Trie树【p4735(bzoj3261)】最大异或和的更多相关文章

  1. 可持久化0-1Trie树

    我跟可持久化数据结构杠上了 \(QwQ\) .三天模拟赛考了两次可持久化数据结构(主席树.可持久化0-1Trie树),woc. 目录: 个人理解 时空复杂度分析 例题及简析 一.个人理解 可持久化0- ...

  2. bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...

  3. BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3519  Solved: 1493[Submit][Status][Discu ...

  4. 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)

    1295 XOR key 2 秒 262,144 KB 160 分 6 级题   给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...

  5. 可持久化01Trie树+LCA【p4592】[TJOI2018]异或

    Description 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\(v_i\).现在有\(Q\)次操作,操作如下: 1\(\;x\;y\):查询节点\(x ...

  6. 可持久化01trie树——模板

    给你一个数,在一段区间内找到另一个数,使得他们的异或最大: trie树上存储每个数的二进制位,查询时贪心查询能让当前高位取得1的位置: 实际上是一个求前缀和的思想.每个数都开一个trie树浪费空间,当 ...

  7. 2018.08.04 bzoj3261: 最大异或和(trie)

    传送门 简单可持久化01trie树. 实际上这东西跟可持久化线段树貌似是一个东西啊. 要维护题目给出的信息,就需要维护前缀异或和并且把它们插入一棵01trie树,然后利用贪心的思想在上面递归就行了,因 ...

  8. 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块

    题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...

  9. ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】

    题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...

随机推荐

  1. gradle web项目启动报错: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener

    严重: Error configuring application listener of class org.springframework.web.util.IntrospectorCleanup ...

  2. 【poj2104-求区间第k大数(不修改)】主席树/可持续化线段树

    第一道主席树~然而是道比较水的...因为它不用修改... 转载一个让我看懂的主席树的讲解吧:http://blog.csdn.net/regina8023/article/details/419106 ...

  3. jQuery操作Table学习总结[转]

    <style type="text/css">       .hover       {                  }    </style>< ...

  4. 【HNOI】d 最小割

    [题目大意]给定一个n*m的土地,每块可以种a或b作物,每种作物在不同的位置有不同的收成,同时,有q个子矩阵中,全部种指定的作物(a或b)会有一定的加成收成,求最大收成. [数据范围] 50% n,m ...

  5. 创建Fragment和传递数值

    下面在扩展一下创建Fragment和传递数值 如果我们不需要传递数值,那就直接可以在宿主activity中,跟平常一样创建fragment,但是如果我们需要传递数据的话,可以使用newInstance ...

  6. pinctrl框架【转】

    转自:http://www.cnblogs.com/kevinhwang/p/5703192.html pinctrl框架是linux系统为统一各SOC厂家pin管理,目的是为了减少SOC厂家系统移植 ...

  7. Yii 1.1.17 六、开启路由与使用缓存

    一.开启路由 1.在配置文件main.php的components中 定义如下: // 定义路由 'urlManager'=>array( // URL模式为PATHINFO 'urlForma ...

  8. Python2.7.3 Tkinter Entry(文本框) 说明

      Python学习记录--关于Tkinter Entry(文本框)的选项.方法说明,以及一些示例. 属性(Options) background(bg) borderwidth(bd) cursor ...

  9. python基础===两个list之间移动元素

    首先我们先了解一下list的几个常用函数: a = [123,456,"tony","jack"] #list中增加元素a.append("www&q ...

  10. sublime Text3 === 无法输入input的问题解决办法

    sublimetext无法对input或者raw_input执行.因此搜了很多方法后,解决了这个问题: 1.先下载插件sublimerepl ,如果无法下载,请点击https://github.com ...