RE #10#11 求调
查看原帖
RE #10#11 求调
453555
qW__Wp楼主2024/6/22 10:44

bool 开了

双倍空间开了

#10 数据下载了,n 是 1e5

#include <bits/stdc++.h>
#define endl '\n'
//#define int long long

using namespace std;

const int N = 2e5 + 5;

int hd[N], cnt;
int son[N][2], tot;
int num[N];

struct Edge {
	int to, nx, w;
} e[N << 1];

void add(int u, int v, int w) {
	e[ ++ cnt] = {v, hd[u], w}, hd[u] = cnt;
}

void ins(int num) {
	int p = 0;
	for (int i = 31; i >= 0; i --) {
		int x = (1 << i);
		bool id = num & x;
		if (!son[p][id]) son[p][id] = ++ tot;
		p = son[p][id];
	}
}

int query(int num) {
	int p = 0, res = 0;
	for (int i = 31; i >= 0; i --) {
		int x = (1 << i);
		bool id = num & x;
		if (son[p][!id]) p = son[p][!id], res += x;
		else p = son[p][id];
	}
	return res;
}

void dfs(int u, int fa, int x) {
	num[u] = x;
	for (int i = hd[u]; i; i = e[i].nx) {
		int v = e[i].to, w = e[i].w;
		if (v == fa) continue;
		dfs(v, u, x ^ w);
	}
}

signed main() {
//	freopen("P4551_10.in", "r", stdin);
//	freopen("test.out", "w", stdout);
	int n;
	cin >> n;
	for (int i = 1; i < n; i ++) {
		int u, v, w;
		cin >> u >> v >> w;
		add(u, v, w), add(v, u, w);
	}
	dfs(1, 0, 0);
	for (int i = 1; i <= n; i ++) ins(num[i]);
	int ans = 0;
	for (int i = 1; i <= n; i ++) ans = max(ans, query(num[i]));
	cout << ans;
	return 0;
}
2024/6/22 10:44
加载中...