UVa 13277 XOR Path
题目分析
问题描述
给定一棵无根带权树,节点数为 nnn (n≤100000n \leq 100000n≤100000),边权为 161616 位无符号整数(取值范围为 000 到 216−12^{16}-1216−1)。对于每个整数 xxx (0≤x≤216−10 \leq x \leq 2^{16}-10≤x≤216−1),需要计算树中有多少对不同的无序节点 (u,v)(u,v)(u,v),使得它们之间的路径异或和等于 xxx。
路径异或和定义为连接两节点的唯一路径上所有边权的异或和。
关键观察
-
异或路径性质
在树结构中,如果选定任意节点作为根,定义 dist[u]dist[u]dist[u] 为节点 uuu 到根节点的路径异或和,那么任意两个节点 uuu 和 vvv 之间的路径异或和可以表示为:
dist[u]⊕dist[v] dist[u] \oplus dist[v] dist[u]⊕dist[v]
这是因为从 uuu 到 vvv 的路径可以看作 u→root→vu \to root \to vu→root→v,而公共部分 root→LCA(u,v)root \to LCA(u,v)root→LCA(u,v) 在异或操作中会相互抵消。 -
问题转化
原问题转化为:给定数组 dist[1..n]dist[1..n]dist[1..n],计算对于每个 xxx,满足 dist[i]⊕dist[j]=xdist[i] \oplus dist[j] = xdist[
