MLE求助,有关注做回报
查看原帖
MLE求助,有关注做回报
366470
hc_awa楼主2021/8/15 09:31

全MLE,0pts

#include <cstdio>
#include <vector>
#include <cstring>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=31e5+7;

struct Trie {
	int ch[N][2];
	int siz;
	inline Trie() {
		siz=0;
		memset(ch,0,sizeof(ch));
	}
	inline void insert(int x) {
		int u=0;
		for(int i=31;~i;--i) {
			int c=x>>i&1;
			if(!ch[u][c])
				ch[u][c]=++siz;
			u=ch[u][c];
		}
	}
	inline int query(int x) {
		int u=0,res=0;
		for(int i=31;~i;--i) {
			int c=x>>i&1;
			if(ch[u][!c]) {
				u=ch[u][!c];
				res=(res<<1)+(!c);
			}
			else {
				u=ch[u][c];
				res=(res<<1)+c;
			}
		}
		return res;
	}
}trie;

vector<pair<int,int> > edge[N];

int val[N];

int n,ans;

inline void dfs(int u,int sum) {
	val[u]=sum;
	for(int i=0,v,w;i<edge[u].size();++i) {
		v=edge[u][i].first,w=edge[u][i].second;
		dfs(v,sum^w);
	}
}

signed main() {
	scanf("%d",&n);
	for(int i=1,u,v,w;i<n;++i) {
		scanf("%d%d%d",&u,&v,&w);
		edge[u].push_back({v,w});
	}
	dfs(1,0);
	for(int i=1;i<=n;++i) {
		trie.insert(val[i]);
		ans=max(ans,val[i]^trie.query(val[i]));
	}
	printf("%d",ans);
    return 0;
}

2021/8/15 09:31
加载中...