[bzoj3261]最大异或和
可持久化01trie
注意最后一个节点的sz不能赋值成1,要赋值成lst.sz+1
- 代码
#include<bits/stdc++.h>
using namespace std;
const int LEN=25,N=6e5+5;
struct trienode{
int ch[2],endtime;
int sum;
}t[LEN*N];
int n,m;
int cnt=0,null=0,root[N];
int newnode(){return ++cnt;}
inline void ins(int x,int pst,int id){
int sum[26];
for(int i=24;i>=0;i--)
if((1<<i)&x)sum[24-i]=1;
else sum[24-i]=0;
int lst=root[pst],cur=root[id]=newnode();
for(int i=0;i<=24;i++){
t[cur].endtime=t[lst].endtime+1;
t[cur].ch[sum[i]^1]=t[lst].ch[sum[i]^1];
cur=t[cur].ch[sum[i]]=newnode(),lst=t[lst].ch[sum[i]];
}
t[cur].endtime=t[lst].endtime+1,t[cur].sum=x;
}
inline int qry(int l,int r,int xorsum){
int sum[26];
for(int i=24;i>=0;i--)
if((1<<i)&xorsum)sum[24-i]=1;
else sum[24-i]=0;
int cur=root[r],pst=root[l-1];
for(int i=0;i<=24;i++){
if( t[t[cur].ch[sum[i]^1]].endtime - t[t[pst].ch[sum[i]^1]].endtime > 0)
cur=t[cur].ch[sum[i]^1],pst=t[pst].ch[sum[i]^1];
else
cur=t[cur].ch[sum[i]],pst=t[pst].ch[sum[i]];
}
return t[cur].sum^xorsum;
}
char getopt(){
char x=0;while(x<'A'||x>'Z')x=getchar();
return x;
}
int tot=0,top=0;
int main()
{
scanf("%d%d",&n,&m);
for(int x,i=1;i<=n;i++){
scanf("%d",&x);
tot^=x,++top;
ins(tot,top-1,top);
}
for(int i=1;i<=m;i++){
char opt=getopt();
int l,r,x;
if(opt=='A'){
scanf("%d",&x);
tot^=x,top++;
ins(tot,top-1,top);
}
if(opt=='Q'){
scanf("%d%d%d",&l,&r,&x);
int ans=0;
if(r>1)ans=qry(max(l-1,1),r-1,x^tot);
if(l==1)ans=max(ans,x^tot);
printf("%d\n",ans);
}
}
}