字典树TLE求助
查看原帖
字典树TLE求助
94475
锦依卫小生楼主2024/8/26 20:31

如题,赛时没想出做法,赛后意识到可以字典树但是T的更惨(还没赛时骗的多)

#include<bits/stdc++.h>
using namespace std;
const int MAX=2e6+5;
int b[MAX],f[MAX],n,ans[MAX];
// 快读     
set<int> s;
int ch[MAX*21][2],tot;
int tag[MAX*21];
int read(){
	int x = 0;
	char c = getchar();
	while(c < '0' || c > '9'){
		c = getchar();
	}
	while(c >= '0' && c <= '9'){
		x = x*10+c-'0';
		c = getchar();
	}
	return x;
}
int pmax;
void insert(int x){
	int u=1;
	for(int i=pmax;i>=0;--i){
		int c=0;
		if(x&(1<<i))
			c=1;
		if(!ch[u][c]){
			ch[u][c]=++tot;
		}
		u=ch[u][c];
	}
	tag[u]=x;
}
bool check(int x){
	int u=1;
	for(int i=pmax;i>=0;--i){
		if(x&(1<<i)){
			if(ch[u][0]){
				u=ch[u][0];
			} 
			else
				u=ch[u][1];
		}
		else{
			if(ch[u][1])
				u=ch[u][1];
			else
				u=ch[u][0];
		}
	}
	return (tag[u]^x)<=n;
}
void solve(){
	n=read();
	s.clear();
	for(int i=1;i<=n-1;++i)
		b[i]=read();
	f[1]=0;
	for(int i=2;i<=n;++i)
		f[i]=f[i-1]^b[i-1];
	pmax=0;
	for(int i=0;i<=21;++i){
		if(n&(1<<i))
			pmax=i; 		
	}

	tot=1;
	for(int i=1;i<=n;++i){
		insert(f[i]);
		s.insert(f[i]); 
	}
	int res=0; 
	for(int i=1;i<=n;++i){
		if(s.find(i)==s.end()&&check(i)){
			res=i;
			break;
		}			
	}
	for(int i=1;i<=n;++i){
		printf("%d ",res^f[i]);
	}
	for(int i=1;i<=tot;++i){
		ch[i][0]=ch[i][1]=0;
	}
	printf("\n");
}
int main(){
	int T;
	T=read();
	while(T--){
		solve();
	}
}
2024/8/26 20:31
加载中...