版权声明:欢迎转载!请注明出处!qwq https://blog.csdn.net/g21glf/article/details/86648507
传送门
【题目分析】
emmm,不会啊qwq。
好像是强行重构字典树?喵喵喵?
先把标程拍上来,看懂再更吧。
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
int n,q;
int a[MAXN];
int t[MAXN*20][2],siz[MAXN*20],tot;
int xorn;
int tag[MAXN],ch[MAXN],rt[MAXN];
int Read(){
int i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-')
f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
void insert(int s,int x){
int pre=rt[s-1];
rt[s]=++tot;
int now=rt[s];
for(int i=30;i>=0;--i){
int d=(x>>i)&1;
if(tag[i])
d=0;
siz[now]=siz[pre]+1;
t[now][d^1]=t[pre][d^1];
t[now][d]=++tot;
now=t[now][d];
pre=t[pre][d];
}
siz[now]=siz[pre]+1;
}
int query(int i,int j,int x){
int ans=0;
int r=i,l=j;
for(int s=30;s>=0;--s){
if(tag[s]){
ans+=(1<<s)*ch[s];
r=t[r][0],l=t[l][0];
}
else{
int d=(xorn>>s)&1;
int k=siz[t[r][d]]-siz[t[l][d]];
if(k>=x){
l=t[l][d],r=t[r][d];
}
else{
x-=k;
ans+=(1<<s);
l=t[l][d^1],r=t[r][d^1];
}
}
}
return ans;
}
int main(){
n=Read(),q=Read();
insert(1,0);
for(int i=1;i<=n;++i){
a[i]=Read();
insert(i+1,a[i]);
}
while(q--){
char cz[5];
scanf("%s",cz);
if(cz[0]=='X'){
int x=Read();
xorn^=x;
for(int i=0;i<=30;++i)
if(tag[i]&&((x>>i)&1))
ch[i]^=1;
}
if(cz[0]=='O'){
int x=Read(),flag=0;
for(int i=0;i<=30;++i){
if((x>>i)&1){
if(tag[i])
ch[i]=1;
else{
flag=1;
tag[i]=ch[i]=1;
}
}
}
if(flag){
tot=0;
memset(siz,0,sizeof(siz));
memset(t,0,sizeof(t));
memset(rt,0,sizeof(rt));
insert(1,0);
for(int i=1;i<=n;++i)
insert(i+1,a[i]);
}
}
if(cz[1]=='n'){
int x=Read(),flag=0;
for(int i=0;i<=30;++i){
if(!((x>>i)&1)){
if(tag[i])
ch[i]=0;
else{
flag=1;
tag[i]=1,ch[i]=0;
}
}
}
if(flag){
tot=0;
memset(siz,0,sizeof(siz));
memset(t,0,sizeof(t));
memset(rt,0,sizeof(rt));
insert(1,0);
for(int i=1;i<=n;++i)
insert(i+1,a[i]);
}
}
if(cz[1]=='s'){
int l=Read(),r=Read(),x=Read();
cout<<query(rt[r+1],rt[l],x)<<'\n';
}
}
return 0;
}