题目链接:1295 XOR key
模板
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=50009;
int tot;
int Son[maxn*30][2];
int sum[maxn*60];
void insert(int p,int q,int x){
for(int i=31;i>=0;--i){
int id=x>>i&1;
if(q) Son[p][id^1]=Son[q][id^1];
Son[p][id]=++tot;
sum[p]=sum[q]+1;
p=Son[p][id];
q=Son[q][id];
}
sum[p]=sum[q]+1;
}
int ask(int p,int q,int x){
int res=0;
for(int i=31;i>=0;--i){
int id=x>>i&1;
if(sum[Son[p][id^1]]-sum[Son[q][id^1]]>0) res+=1<<i,p=Son[p][id^1],q=Son[q][id^1];
else p=Son[p][id],q=Son[q][id];
}
return res;
}
int root[maxn];
int main(){
int n,q,x,l,r;
scanf("%d%d",&n,&q);
for(int i=1,x;i<=n;++i){
scanf("%d",&x);
root[i]=++tot;
insert(root[i],root[i-1],x);
}
while(q--){
scanf("%d%d%d",&x,&l,&r);
++l,++r;
printf("%d\n",ask(root[r],root[l-1],x));
}
return 0;
}

本文介绍了如何运用位运算中的XOR特性解决LeetCode上的1295题。通过建立可持久化的Trie数据结构,高效地处理数据并找到满足条件的XOR key。

被折叠的 条评论
为什么被折叠?



