震惊到MnZn了
查看原帖
震惊到MnZn了
690160
ask_silently楼主2024/8/11 09:59

社区大佬分享的第11个测试点,本地测试过了,但交上洛谷没过!震惊,求调

#include <bits/stdc++.h>
using namespace std;

const int N=6e5+10;

int n,m,idx,cnt,rt1,rt2;
int a[N],tr[N*25][3],root[N],mex[N*25];

inline int read(){
	int t=0,f=1;
	register char c=getchar();
	while (c<48||c>57) f=(c=='-')?(-1):(f),c=getchar();
	while (c>=48&&c<=57)t=(t<<1)+(t<<3)+(c^48),c=getchar();
	return f*t;
}

void insert(int x,int d){
	root[d]=++cnt,rt2=cnt,mex[rt2]=d;
	if(d!=0) rt1=root[d-1];
	else rt1=rt2;
	for(int i=25;i>=1;i--){
		int dang=(x>>i-1)&1;
		tr[rt2][dang^1]=tr[rt1][dang^1];
		tr[rt2][dang]=++cnt;
		rt1=tr[rt1][dang],rt2=tr[rt2][dang];
		mex[rt2]=d;
	}
}

int find(int l,int r,int x){
	int rt=root[r],sum=0;
	for(int i=25;i>=1;i--){
		int dang=(x>>i-1)&1;
		if(tr[rt][dang^1]&&mex[tr[rt][dang^1]]>=l){
			sum+=(1<<i-1);
			rt=tr[rt][dang^1];
		}else rt=tr[rt][dang];
	}
	return sum;
}

int main(){
	n=read(),m=read(),idx=n;
	for(int i=1;i<=n;i++) a[i]=read(),a[i]^=a[i-1];
	for(int i=0;i<=n;i++) insert(a[i],i);
//	for(int i=1;i<=n;i++) cout<<root[i]<<" ";
//	cout<<endl;
	while(m--){
		char c;
		cin>>c;
		if(c=='A'){
			int x=read();
			a[++idx]=(x^a[idx-1]);
			insert(a[idx],idx);
		}else{
			int l=read(),r=read(),x=read();
			printf("%d\n",find((l-1),(r-1),(a[idx]^x)));
		}
	}
	return 0;
}

2024/8/11 09:59
加载中...