求助!(可持久化01Trie)
  • 板块学术版
  • 楼主miyachn
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/11 16:25
  • 上次更新2024/12/11 19:43:31
查看原帖
求助!(可持久化01Trie)
1295276
miyachn楼主2024/12/11 16:25

有etiger网站的同志可以看一下,没有的话可以走了~ 题号:2896 难度:提高+/省选- 一个点RTE QAQ

#include<bits/stdc++.h>
using namespace std;
const int N=300005;
const int B=31;
int n,m,px[N*8],rt[N*8];
int nT,x,l,r,v,timer;
char op;
struct Node{
	int son[2];
	int sz;
}trie[N*32];
void addRoot(int&u){
	u=++nT;
}
#define sz(u) trie[u].sz
#define son(u,b) trie[u].son[b]
void addTrie(int now,int pre,int v,int p){
	sz(now)=sz(pre)+1;
	if(p<0) return;
	bool b=((1<<p)&v);
	if(!son(now,b)) son(now,b)=++nT;
	son(now,b^1)=son(pre,b^1);
	addTrie(son(now,b),son(pre,b),v,p-1);
}
int query(int now,int pre,int v,int p){
	if(p<0)return 0;
	bool b=((1<<p)&v);
	int diff=sz(son(now,!b))-sz(son(pre,!b));
	if(diff) return (1<<p)+query(son(now,!b),son(pre,!b),v,p-1);
	else return query(son(now,b),son(pre,b),v,p-1);
}
int main(){
	freopen("archive.in","r",stdin);
	freopen("archive.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		px[i]=px[i-1]^x;
	}
	timer=n+1;
	for(int t=1;t<=timer;t++){
		addRoot(rt[t]);
		addTrie(rt[t],rt[t-1],px[t-1],B-1);
	}
	for(int i=1;i<=m;i++){
		scanf(" %c",&op);
		if(op=='A'){
			scanf("%d",&v);
			n++;
			px[n]=px[n-1]^v;
			timer++;
			addRoot(rt[timer]);
			addTrie(rt[timer],rt[timer-1],px[timer-1],B-1);
		}
		else{
			scanf("%d %d %d",&l,&r,&v);
			v^=px[n];
			cout<<query(rt[r],rt[l-1],v,B-1)<<endl;
		}
	}
	return 0;
}

2024/12/11 16:25
加载中...