蒟蒻求助
查看原帖
蒟蒻求助
173510
华恋_韵楼主2020/6/18 15:55
#include<bits/stdc++.h>
using namespace std;
const int N=300010;
int n,m,r;
int a[N];
struct node{
	int ch[2];
	int last;
}t[N<<4];
struct tree{
	int root[N];
	int cnt;
	tree(){
		memset(root,0,sizeof root);
		cnt=0;
	}
	int clone(int p)
	{
		++cnt;
		t[cnt]=t[p];
		return cnt;
	}
	int add(int p,int x ,int d,int last)
	{
		if(d==-1)return 0;
		bool k=(x>>d)&1;
		p=clone(p);
		t[p].last=last;
		t[p].ch[k]=add(t[p].ch[k],x,d-1,last);
		return p;
	}
	int find(int l,int f2,int x,int d)
	{
		if(d==-1)return 0;
		bool k=(x>>d)&1;
		int ans=0;
		if(t[t[f2].ch[!k]].last>=l)ans+=(1<<d),ans+=find(l,t[f2].ch[!k],x,d-1);
		else if(t[t[f2].ch[k]].last>=l)ans+=find(l,t[f2].ch[k],x,d-1);
		return ans;
	}
}T;
int main()
{
	scanf("%d%d",&n,&m);
	for(r=1;r<=n;r++)
	{
		scanf("%d",&a[r]);
		a[r]^=a[r-1];
		T.root[r]=T.add(T.root[r-1],a[r],25,r);
	}
	r--;
	while(m--)
	{
		char k;
		int l,R,x;
		cin>>k;
		switch(k)
		{
			case 'A':{
				++r;
				scanf("%d",&a[r]);
				a[r]^=a[r-1];
				T.root[r]=T.add(T.root[r-1],a[r],25,r);
				break;
			}
			case 'Q':{
				scanf("%d%d%d",&l,&R,&x);
				x^=a[r];
				printf("%d\n",T.find(l-1,T.root[R-1],x,25));
				break;
			}
		}
	}
	return 0;
}

蒟蒻求助,没问题啊,但是样例都过不了

2020/6/18 15:55
加载中...