求助
查看原帖
求助
125901
FxorG楼主2020/5/23 19:31

样例过了 但全WA 得到的都是0

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>

#define MAXN 20000100
#define node_cnt node_tot
#define node tot

using namespace std;

int trie[MAXN][2],size[MAXN],root[MAXN],node_tot,tot;
int n,m,sum;

inline int read()
{
    int X(0),w(0);char ch(0);
    while (!isdigit(ch))w|=ch=='-',ch=getchar();
    while (isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}

inline void write(int x)
{
    if (x<0) putchar('-'),x=-x;
    if (x>9) write(x/10);
    putchar(x%10+'0');
}

void insert(int x) {
	int rt=root[node_tot]; //pre
	root[++node_tot]=++tot;
	
	for(int i=24;i>=0;i--) {
		bool c=x&(1<<i);
		size[tot]=size[rt]+1; 
		trie[tot][c^1]=trie[rt][c^1]; //继承 
		trie[tot][c]=++tot; //新点 
		rt=trie[rt][c]; 
	} 
	
	size[tot]=size[rt]+1;
}


void query(int l,int r,int x) {
	int cl=root[l],cr=root[r],answ=0;
	for(int i=24;i>=0;i--) {
		bool c=x&(1<<i);
		if(size[trie[cr][c^1]]>size[trie[cl][c^1]]) { //这中间有节点 且是反的 
			cl=trie[cl][c^1]; cr=trie[cr][c^1];
			answ|=1<<i;
		} else {
			cl=trie[cl][c]; cr=trie[cr][c];
		}
	}
	
	write(answ);
	putchar('\n');
}

int main() {
	n=read(); m=read();
	insert(0); 
	int x;
	
	for(int i=1;i<=n;i++) {
		x=read(); sum^=x;
		insert(sum);
	} 
	
	int l,r,y;char c;
	for(int i=1;i<=m;i++) {
		cin>>c;
		if(c=='A') {
			y=read();
			sum^=y;
			insert(sum);
		} else {
			l=read(); r=read(); y=read();
			query(l-1,r,y^sum); 
		}
	}
	
	return 0;
}
2020/5/23 19:31
加载中...