可持久化Trie模板
最大亦或和
题解
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int M=6e5+10;
int n,m;
int h[25*M][2];
int root[M];
int sum[M];
int idx;
int max_id[25*M];
int w[M];
void insert2(int i,int pos,int p,int q){// 递归
if(pos<0){
max_id[q]=i;
return ;
}
int v=sum[i]>>pos&1;
if(p){
h[q][v^1]=h[p][v^1];
}
h[q][v]=++idx;
insert2(i,pos-1,h[p][v],h[q][v]);
max_id[q]=max(max_id[h[q][0]],max_id[h[q][1]]);
}
void insert(int k, int p, int q)// 非递归
{
max_id[q] = k;
for(int i = 23; i >= 0; i --)
{
int v = sum[k] >> i & 1;
if(p)h[q][v ^ 1] = h[p][v ^ 1];
h[q][v] = ++ idx;
max_id[h[q][v]] = k;
q = h[q][v], p = h[p][v];
}
}
int query(int l,int q,int x){
int pos=24;
while(pos--){
int v=x>>pos&1;
if(max_id[h[q][v^1]]>=l)q=h[q][v^1];
else q=h[q][v];
}
return max_id[q];
}
int main(){
cin>>n>>m;
root[0]=++idx;
max_id[0]=-1;
insert(0,0,root[0]);
for(int i=1;i<=n;i++){
cin>>w[i];
sum[i]=sum[i-1]^w[i];
root[i]=++idx;
insert(i,root[i-1],root[i]);
}
while(m--){
char a[2];
cin>>a;
if(a[0]=='A'){
int x;
cin>>x;
w[n+1]=x;
sum[n+1]=sum[n]^x;
root[n+1]=++idx;
insert(n+1,root[n],root[n+1]);
n++;
}
else{
int l,r,x;
cin>>l>>r>>x;
x^=sum[n];
cout<<(sum[query(l-1,root[r-1],x)]^x)<<endl;
}
}
}