可持久化+Trie || BZOJ 3261最大异或和 || Luogu P4735 最大异或和
2024-09-05 19:18:19
题面:最大异或和
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=(3e5)+,maxm=maxn;
int N,M,A[maxn<<],rt[maxn<<],cnt=,X,L,R,ans;
char o[];
struct Trie{int cnt,son[];}tr[maxn*];
inline void Insert(int u,int x,int a,int t){
if(t<)return;
int w=(a&(<<t))>;
tr[x].son[!w]=tr[u].son[!w];
tr[x].son[w]=++cnt;
tr[tr[x].son[w]].cnt=tr[tr[u].son[w]].cnt+;
Insert(tr[u].son[w],tr[x].son[w],a,t-);
return;
}
inline void Query(int u,int x,int a,int t){
if(t<)return;
int w=(a&(<<t))>;
w=!w;
if(tr[tr[x].son[w]].cnt>tr[tr[u].son[w]].cnt){
ans+=<<t;
Query(tr[u].son[w],tr[x].son[w],a,t-);
}
else Query(tr[u].son[!w],tr[x].son[!w],a,t-);
return;
}
int main(){
scanf("%d%d",&N,&M);
Insert(,rt[]=++cnt,,);//
for(int i=;i<=N;i++){
scanf("%d",&X);
A[i]=A[i-]^X;
Insert(rt[i-],rt[i]=++cnt,A[i],);
}
while(M--){
scanf("%s",o);
if(o[]=='A'){
scanf("%d",&X);
N++;
A[N]=A[N-]^X;
Insert(rt[N-],rt[N]=++cnt,A[N],);
}
else{
scanf("%d%d%d",&L,&R,&X);
L--;R--;
ans=;
if(L->=)Query(rt[L-],rt[R],A[N]^X,);
else Query(,rt[R],A[N]^X,);
printf("%d\n",ans);
}
}
return ;
}
By:AlenaNuna
最新文章
- No.026:Remove Duplicates from Sorted Array
- SSH 整合及注意事项
- Maven(一)简介和基本安装使用
- 【英语】Bingo口语笔记(26) - Take系列
- 【破解三网】iphone5 国行 A1429
- 安装Ubuntu双系统系列——64位Ubuntu安装H3C的INode客户端
- 分享:根据svg节点对象类型和路径值转换坐标值
- 《Programming WPF》翻译 第8章 6.我们进行到哪里了?
- HDU 5002 Tree
- ICSharpCode.TextEditor如何自定义代码折叠和高亮
- 【Unity3D】Unity3D开发《我的世界》之六、创建地形(视频 + 源码)
- [原创]基于Zynq SDIO WIFI 2.4G/5G SotfAP STA
- 关闭mac的SIP + 一定有用的删除mac自带ABC的方法
- Luogu2264 树上游戏(点分治)
- Android Gradle插件(plugin)版本(version)与Gradle、SDK Build Tools版本关系
- 数据库设计和ER模型-------之ER模型的基本概念(第二章)
- bug -- android 7.0 popwindow显示位置异常情况解决
- 运维url收集
- Android源码-SignApk.java
- Python内置函数之repr()