注意到异或有一个性质,就是异或两次同一个数相当于没有异或,所以对于任意两个点,一个简单路径的异或值和带上很多祖先的异或值其实是相等的。
所以我们可以求出每个点到根节点的异或值,然后枚举计算即可。
边转点。
时间复杂度:O(n2)O(n^2)O(n2)。
注意到瓶颈在于计算异或和,与树无关。所以我们可以不考虑树的部分,只对计算部分进行优化。
考虑拆位。我们可以记录前面的数第 jjj 位为 000 的个数与为 111 的个数,按照 AiA_iAi 的第 jjj 位计算即可。
记得开 __int128。
时间复杂度:O(nlogV)O(n\log V)O(nlogV),其中 V=260V=2^{60}V=260。