原题:https://www.luogu.org/problemnew/show/P4735

题解:观察一下式子,将a数组求一个异或前缀和,其实就是s[n]^x^s[p-1]的最大值 p∈[l,r],就是区间对一个数的异或的最最大值。假设我们把这个区间放进Trie字典树中,对于一个x的询问,可以用贪心的思想,反着走找到最大值。但是确定出给定区间的Trie树,用类似于主席树的思想,建一颗动态开点的Trie树,询问时用前缀和减掉就行了。洛谷的评测很神奇,不开o2过不了。

#include<bits/stdc++.h>
#define reg register
using namespace std;
const int N=600010;
int ch[N*30][2],cnt[N*30],T[N];
int n,m,s[N],tot;
char str[10];
inline int rd(){int x=0;int f=1;char s=getchar();while(!isdigit(s)) f=(s=='-'?-1:f),s=getchar();while(isdigit(s)) x=(x<<1)+(x<<3)+s-'0',s=getchar();return x*f;
}
void ins(int a,int b,int t,int x){if(t<0) return ;int i=(x>>t)&1; ch[a][!i]=ch[b][!i];ch[a][i]=++tot;cnt[ch[a][i]]=cnt[ch[b][i]]+1;ins(ch[a][i],ch[b][i],t-1,x);
}
int query(int a,int b,int t,int x){if(t<0) return 0;int i=(x>>t)&1;if(cnt[ch[b][!i]]>cnt[ch[a][!i]]) return (1<<t)+query(ch[a][!i],ch[b][!i],t-1,x);else return query(ch[a][i],ch[b][i],t-1,x);
}
inline void print(int x){if(x==0) {puts("0");return ;} if(x<0) {putchar('-');x=0-x;}int d[30],now=-1;while(x) d[++now]=x%10,x/=10;for(int i=now;i>=0;i--) putchar('0'+d[i]);puts("");}
int main(){
//  freopen("p4735.in","r",stdin);n=rd();m=rd();T[0]=++tot;ins(T[0],0,25,0);for(int i=1;i<=n;i++){s[i]=rd();s[i]^=s[i-1]; T[i]=++tot;ins(T[i],T[i-1],25,s[i]);} for(int i=1;i<=m;i++){scanf("%s",&str);int x,l,r;if(str[0]=='A'){s[++n]=rd();s[n]^=s[n-1];T[n]=++tot;ins(T[n],T[n-1],25,s[n]);}else{l=rd()-1;r=rd()-1;x=rd();int ans=0;if(l==0) ans=query(0,T[r],25,x^s[n]);//else ans=query(T[max(0,l-1)],T[r],25,x^s[n]);print(ans);}}return 0;
}

P4735 最大异或和 01可持久化Trie树模板相关推荐

  1. P4735 最大异或和(可持久化trie树、求最大区间异或和)

    P4735 最大异或和 我们维护一个前缀异或和:s[i]=a[1]xora[2]xor-a[i−1]xora[i]s[i] = a[1] \ xor\ a[2]\ xor\ - a[i-1] \ xo ...

  2. P4735 最大异或和(可持久化字典树)

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

  3. P4735 最大异或和(可持久化字典树 ? 主席树)

    异或满足可减性,所以可以维护前缀和,然后 a[p] xor a[p + 1] xor ... xor a[n] xor = s[p - 1] xor s[n] xor然后就只要维护s[].添加很好维护 ...

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

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

  5. 【bzoj3261】最大异或和 可持久化Trie树

    题目描述 给定一个非负整数序列 {a},初始长度为 N.        有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...

  6. BZOJ3261 最大异或和 解题报告(可持久化Trie树)

    本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...

  7. BZOJ3261: 最大异或和(可持久化trie树)

    题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...

  8. BZOJ 3261 最大异或和 可持久化Trie树

    题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...

  9. HDU - 4757 Tree(LCA+可持久化trie树)

    题目链接:点击查看 题目大意:给出一棵有有n个节点的树,每个点都有一个权值,现在给出m个查询,每次查询的形式为:x,y,z,求出从点x到点y的路径上任选一点,使其与z的异或值最大,输出异或值 题目分析 ...

最新文章

  1. 在代码中获取ApplicationContext实例
  2. Linux shell test用法
  3. Android使用ActivityGroup设置android:windowSoftInputMode失效的问题
  4. jvm性能调优 - 20G1垃圾回收器应该如何设置参数
  5. 用Go语言建立一个简单的区块链part2:Pow共识
  6. 感谢前任程序员赏饭吃!
  7. 工程师们在摔倒后如何不尴尬
  8. Cesium:点击实体后在实体上方添加div,并随地球转动不断更新位置
  9. db2与mysql语法区别_db2和mysql语法的区别是什么
  10. sap的工作日历_ABAP-有关日期的SAP函数使用(日历)
  11. SPSS:主成分分析确定不同指标权重
  12. 加性噪声(目前不理解)
  13. 单片机及开发板的介绍
  14. 打印机无法访问计算机,打印机拒绝访问,详细教您打印机拒绝访问无法连接怎么解决...
  15. 浏览器默认主页被篡改(chrome,IE)
  16. 一文搞懂「微信支付 Api-v3」接口规则所有知识点
  17. java解析ceb文件_读取文件夹内容解析为Tree结构
  18. 安卓期末大作业——Android水果连连看
  19. html读写Mysql数据库
  20. html表白画画,超可爱·少女心·表白简笔画:我喜欢你,你就得跟我在一起!

热门文章

  1. WWDC20 Session 清单(06-23)
  2. 迅为瑞芯微3399开发板Ubuntu系统-安装ssh
  3. netstat+taskkill命令解决windows端口占用问题
  4. 我与CSDN的2020
  5. 行走的Offer收割机,首次公布Java10W字面经,Github访问量破百万
  6. iOS网络监测如何区分2、3、4G(Reachability)
  7. Android软件安全与逆向分析下载电子书pdf下载
  8. Vue Vue3的生命周期
  9. 给浏览器升个级,5款必备浏览器插件推荐
  10. 如何做好一名软件实施顾问