[多校联考2019(Round 4 T1)][51nod 1295]Xor key(可持久化trie)
[51nod 1295]Xor key(可持久化trie)
题面
给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R)。求A[L] 至 A[R] 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值是多少?
分析
可持久化trie裸题
代码
#include<iostream> #include<cstdio> #define maxb 31 #define maxn 200000 #define maxs 6400000 using namespace std; inline void qread(int &x){ x=0; int sign=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') sign=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } x=x*sign; } inline void qprint(int x){ if(x<0){ putchar('-'); qprint(-x); }else if(x==0){ putchar('0'); return; }else{ if(x>=10) qprint(x/10); putchar('0'+x%10); } } int n,q; int a[maxn+5]; struct persist_trie{ int sz[maxs+5]; int root[maxn+5]; int son[maxs+5][2]; int ptr=0; void insert(int pos,int val){ int now=root[pos]=++ptr; int last=root[pos-1]; for(int i=maxb;i>=0;i--){ sz[now]=sz[last]+1; int k=(val>>i)&1; son[now][k]=++ptr; son[now][k^1]=son[last][k^1]; now=son[now][k]; last=son[last][k]; } sz[now]=sz[last]+1; } int query(int l,int r,int val){ int now=root[r]; int last=root[l-1]; int ans=0; for(int i=maxb;i>=0;i--){ int k=(val>>i)&1; int lsz=sz[son[now][k^1]]-sz[son[last][k^1]]; if(lsz){ now=son[now][k^1]; last=son[last][k^1]; ans=ans*2+1; }else{ now=son[now][k]; last=son[last][k]; ans=ans*2; } } return ans; } }T; int main(){ // freopen("1.in","r",stdin); // freopen("1.ans","w",stdout); int l,r,x; qread(n); qread(q); for(int i=1;i<=n;i++){ qread(a[i]); T.insert(i,a[i]); } for(int i=1;i<=q;i++){ qread(x); qread(l); qread(r); l++; r++; qprint(T.query(l,r,x)); putchar('\n'); } }
版权声明:因为我是蒟蒻,所以请大佬和神犇们不要转载(有坑)的文章,并指出问题,谢谢
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步