可持久化01trie求调,码风良好
查看原帖
可持久化01trie求调,码风良好
750163
_Kenma_楼主2024/7/3 15:50
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a,l,r,sum;
int h[600005];
int rt[600005],son[32000005][2],size[32000005],dcnt,rt_cnt;
void insert(int a,int pre,int now){
	rt[now]=++dcnt;
	int pre_x=rt[pre],now_x=rt[now];
	for(int i=25;i>=1;i--){
		int op=(a&(1<<(i-1)));
		size[now_x]=size[pre_x]+1;
		son[now_x][op]=++dcnt;
		son[now_x][!op]=son[pre_x][!op];
		pre_x=son[pre_x][op]; 
		now_x=son[now_x][op]; 
	}
	size[now_x]=size[pre_x]+1;
}
int query(int l,int r,int a){
	int l_x=rt[l],r_x=rt[r],ans=0;
	for(int i=25;i>=1;i--){
		int op=(a&(1<<(i-1)));
		if(size[son[r_x][!op]]-size[son[l_x][!op]]>0){
			l_x=son[l_x][!op];
			r_x=son[r_x][!op];
			ans|=(1<<(i-1)); 
		}else{
			l_x=son[l_x][op];
			r_x=son[r_x][op];
		}
	}
	return ans;
}
char op;
signed main(){
	cin>>n>>m;
	insert(0,rt_cnt,++rt_cnt); 
	for(int i=1;i<=n;i++){
		cin>>h[i];
		sum^=h[i];
		insert(sum,rt_cnt,++rt_cnt);
	}
	for(int i=1;i<=m;i++){
		cin>>op;
		if(op=='A'){
			cin>>a;
			sum^=a;
			insert(sum,rt_cnt,++rt_cnt);
		}else{
			cin>>l>>r>>a;
			cout<<query(l-1,r,a^sum)<<'\n';
		}
	}
	return 0;
}
2024/7/3 15:50
加载中...