获得一个粉丝的好方法
查看原帖
获得一个粉丝的好方法
663949
HYLW楼主2024/8/10 16:16

我把讨论区的所有警示都翻遍了,还是不知道哪里错了

#include<bits/stdc++.h>
using namespace std;
const int N = 600100,M = N*27;
int n,m;
struct node{
	int s[2];
}tr[M];//字典树 
int max_id[M];
int cnt,idx;//前者节点数量,后者版本数量 
int root[N];//版本号 

int sum[N];//异或前缀和 

void insert(int x,int id){//插入 
	++idx,++cnt;
	root[idx]=cnt;
	int p=root[idx-1],u=root[idx];
	for(int i=23,t;i>=0;i--){
		t=(x>>i)&1;
		if(tr[p].s[t^1])
			tr[u].s[t^1]=tr[p].s[t^1];
		tr[u].s[t]=++cnt;
		max_id[cnt]=id;
		p=tr[p].s[t],u=tr[u].s[t];
	}
}

int query(int x,int r,int l){
	int u=root[r],res=0;
	for(int i=23,t;i>=0;i--){
		t=(x>>i)&1;
		if(tr[u].s[t^1] && max_id[tr[u].s[t^1]]>=l)
			u=tr[u].s[t^1],res^=(1<<i);
		else{
			u=tr[u].s[t];
		}
	}
	return res;
}

int main(){
	char c[2];
	int l,r,x;
	insert(0,0);//警示后人中加的 
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		sum[i]=sum[i-1]^x;
		insert(sum[i],i);
	}
	while(m--){
		scanf("%s",c);
		if(c[0]=='A'){
			scanf("%d",&x);n++;
			sum[n]=sum[n-1]^x;
			insert(sum[x],n);
		}else{
			scanf("%d%d%d",&l,&r,&x);
			x=x^sum[n];
			printf("%d\n",query(x,r,l-1));
			//主要是因为版本号多1,但是插入编号没变,所以l-1,r不减1 
		}
	}
	return 0;
}

//void couten(){
//	printf("--------------\n");
//	printf("there're %d tries.\n",idx);
//	for(int i=1;i<=idx;i++){
//		vector<int> q;
//		printf("time:%d,id:%d\n",i,root[i]);
//		q.push_back(root[i]);
//		while(q.size()){
//			vector<int> g;
//			for(int i=0;i<q.size();i++){
//				printf("%d[0:%d,1:%d](%d) ",q[i],tr[q[i]].s[0],
//											tr[q[i]].s[1],max_id[q[i]]);
//				if(tr[q[i]].s[0])	g.push_back(tr[q[i]].s[0]);
//				if(tr[q[i]].s[1])	g.push_back(tr[q[i]].s[1]);
//			}
//			q=g;
//			puts("");
//		}
//		puts("");
//	}
//	puts("---------------\n");
//}
2024/8/10 16:16
加载中...