这个似乎也不是好难啊

但是可持久化Trie还是可以干许多线性基不能干的事。

什么是可持久化Trie?

顾名思义:是一种可以持久化的Trie树

他的建树方式和键值式线段树方式类似

也支持版本的减法

查询的本质是贪心:

利用版本减法判断第K位上的Trie值是不是成立

以此向下查询

#include<bits/stdc++.h>
using namespace std;
inline void read(int &x){x=0;int f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
const int N=6e5+100;
int bin[30]={};
int root[N]={};
struct Trie{int sum[N*24];int ch[N*24][2];int cnt;inline int insert(int x,int val){int tmp=++cnt;int y=cnt;for(int i=23;i>=0;i--){ch[y][0]=ch[x][0];ch[y][1]=ch[x][1];sum[y]=sum[x]+1;int t=val&(bin[i]);t>>=i;x=ch[x][t];ch[y][t]=++cnt;y=ch[y][t];}sum[y]=sum[x]+1;return tmp;}inline int query(int l,int r,int val){int tmp=0;for(int i=23;i>=0;i--){int t=val&(bin[i]);t>>=i;if(sum[ch[r][t^1]]-sum[ch[l][t^1]]){tmp+=bin[i];r=ch[r][t^1];l=ch[l][t^1];}else l=ch[l][t],r=ch[r][t];}    return tmp;}
}T;
int n,m;
int A[N]={};
int B[N]={};
int main(){
//  freopen("bzoj3261.in","r",stdin);
//  freopen("bzoj3261.out","w",stdout);read(n);read(m);bin[0]=1;for(int i=1;i<=23;i++)bin[i]=bin[i-1]*2;n++;for(int i=2;i<=n;i++)read(A[i]);for(int i=1;i<=n;i++)B[i]=B[i-1]^A[i];for(int i=1;i<=n;i++){
//      cout<<B[i]<<'\n';root[i]=T.insert(root[i-1],B[i]);}
//  cout<<query(root[1],root[n],0)<<'\n';for(int i=1;i<=m;i++){char opt[2];scanf("%s",opt);if(opt[0]=='A'){int x;n++;read(x);B[n]=B[n-1]^x;root[n]=T.insert(root[n-1],B[n]); }else{int l,r,x;read(l);read(r);read(x);cout<<T.query(root[l-1],root[r],B[n]^x)<<'\n';}
//      cout<<i<<" "<<'\n';}return 0;
}

转载于:https://www.cnblogs.com/Leo-JAM/p/10079191.html

省选专练(学习)可持久化Trie树(BZOJ3261)相关推荐

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

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

  2. 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 ...

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

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

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

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

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

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

  6. BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)

    #3166. [Heoi2013]Alo description solution code BZOJ3166 description Welcome to ALO ( Arithmetic and ...

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

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

  8. 省选专练(学习)AC自动机

    我好菜啊 AC自动机都不会 AC自动机可以干什么: 用一个模板串匹配多个子串. 这便让AC自动机可以干许多KMP和Tri树不能干的事. AC自动机的构造 首先建立一颗Trie树. 其次利用KMP的思想 ...

  9. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】

    题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...

最新文章

  1. do_exit——exit_notify()【转】
  2. Android JNI入门第六篇——基本数据类型使用
  3. SQL SERVER 2005 CTE(通用表达式)
  4. 图形处理(十二)拉普拉斯网格优化、最小二乘网格模型光顺
  5. html加javascript和canvas类似超级玛丽游戏
  6. dubbo启动时检查服务
  7. css3宽度变大动画_动画演示流量计的工作原理
  8. Python爬虫--- 1.2 BS4库的安装与使用
  9. 基于R语言实现的交通时空大数据处理
  10. Meteor的工作原理及优势与不足
  11. WiFi音箱在国内普及需解决的三点
  12. python统计pdf字数代码_Python基本数据统计.pdf
  13. 计算机驱动程序属于系统还是软件,什么是VGA驱动程序?
  14. php oa系统 缺点,PHPOA:被低估的OA自动化系统
  15. 波士顿房价预测(一)
  16. Unity 坐标转换
  17. Vue插件报错:Vue.js is detected on this page.
  18. Vim插件之vim-autoformat
  19. imgproc/src/morph.simd.hpp:756: error:(-213:The function/feature is not implemented)解决方案
  20. 爱奇艺QA测试环境管理平台初探

热门文章

  1. 谷歌深度学习公开课任务 5: Word2VecCBOW
  2. MySQL多实例学习笔记
  3. #include quot;*.cquot;文件的妙用
  4. Web Essentials之样式表StyleSheets
  5. 多浏览器 div 半透明
  6. dojo helloworld
  7. DNN数据库核心表结构及设计思路探研
  8. Vue自定义指令实现下拉加载:v-loadmore
  9. ios tableview 滑动到底部
  10. 20155117 王震宇 2006-2007-2 《Java程序设计》第三周学习总结