LOJ6144 可持久化数据结构(可持久化Trie)

版权声明:欢迎转载!请注明出处!qwq https://blog.csdn.net/g21glf/article/details/86648507

传送门

【题目分析】

emmm,不会啊qwq。

好像是强行重构字典树?喵喵喵?

先把标程拍上来,看懂再更吧。

【代码~】

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;

int n,q;
int a[MAXN];
int t[MAXN*20][2],siz[MAXN*20],tot;
int xorn;
int tag[MAXN],ch[MAXN],rt[MAXN];

int Read(){
	int i=0,f=1;
	char c;
	for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
	if(c=='-')
	  f=-1,c=getchar();
	for(;c>='0'&&c<='9';c=getchar())
	  i=(i<<3)+(i<<1)+c-'0';
	return i*f;
}

void insert(int s,int x){
	int pre=rt[s-1];
	rt[s]=++tot;
	int now=rt[s];
	for(int i=30;i>=0;--i){
		int d=(x>>i)&1;
		if(tag[i])
		  d=0;
		siz[now]=siz[pre]+1;
		t[now][d^1]=t[pre][d^1];
		t[now][d]=++tot;
		now=t[now][d];
		pre=t[pre][d];
	}
	siz[now]=siz[pre]+1;
}

int query(int i,int j,int x){
	int ans=0;
	int r=i,l=j;
	for(int s=30;s>=0;--s){
		if(tag[s]){
			ans+=(1<<s)*ch[s];
			r=t[r][0],l=t[l][0];
		}
		else{
			int d=(xorn>>s)&1;
			int k=siz[t[r][d]]-siz[t[l][d]];
			if(k>=x){
				l=t[l][d],r=t[r][d];
			}
			else{
				x-=k;
				ans+=(1<<s);
				l=t[l][d^1],r=t[r][d^1];
			}
		}
	}
	return ans;
}

int main(){
	n=Read(),q=Read();
	insert(1,0);
	for(int i=1;i<=n;++i){
		a[i]=Read();
		insert(i+1,a[i]);
	}
	while(q--){
		char cz[5];
		scanf("%s",cz);
		if(cz[0]=='X'){
			int x=Read();
			xorn^=x;
			for(int i=0;i<=30;++i)
			  if(tag[i]&&((x>>i)&1))
			    ch[i]^=1;
		}
		if(cz[0]=='O'){
			int x=Read(),flag=0;
			for(int i=0;i<=30;++i){
				if((x>>i)&1){
					if(tag[i])
					  ch[i]=1;
					else{
						flag=1;
						tag[i]=ch[i]=1;
					}
				}
			}
			if(flag){
				tot=0;
				memset(siz,0,sizeof(siz));
				memset(t,0,sizeof(t));
				memset(rt,0,sizeof(rt));
				insert(1,0);
				for(int i=1;i<=n;++i)
				  insert(i+1,a[i]);
			}
		}
		if(cz[1]=='n'){
			int x=Read(),flag=0;
			for(int i=0;i<=30;++i){
				if(!((x>>i)&1)){
					if(tag[i])
					  ch[i]=0;
					else{
						flag=1;
						tag[i]=1,ch[i]=0;
					}
				}
			}
			if(flag){
				tot=0;
				memset(siz,0,sizeof(siz));
				memset(t,0,sizeof(t));
				memset(rt,0,sizeof(rt));
				insert(1,0);
				for(int i=1;i<=n;++i)
				  insert(i+1,a[i]);
			}
		}
		if(cz[1]=='s'){
			int l=Read(),r=Read(),x=Read();
			cout<<query(rt[r+1],rt[l],x)<<'\n';
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/g21glf/article/details/86648507