aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

arc 045 C - エックスオア多橋君 (python)

頂点1を根として、dfs をしていき、それまでの xor 和を defaultdict (D) で管理して、現在のxor和 = X^a を満たす a が今までの xor和に含まれていればいいので、dfs 順に D [ 現在のxor和^X ] を足していけばいい。根からの xor和がちょうど X になるときも答えに含めるため、最初に D [ 0 ] = 1 としておく。

import sys
sys.setrecursionlimit(10**7)
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
from collections import defaultdict

n, x = map(int, readline().split())
g = [[] * n for i in range(n)]
for i in range(n-1):
    u, v, c = map(int, readline().split())
    u -= 1
    v -= 1
    g[u].append((v,c))
    g[v].append((u,c))

D = defaultdict(int)
D[0] += 1
ans = 0
def dfs(now, prev, xors):
  global ans
  for next,co in g[now]:
    if next != prev:
      xx = xors^co
      ans += D[xx^x]
      D[xx] += 1
      dfs(next, now, xx)
  return ans

print(dfs(0, -1, 0))