def palindromePaths(tree_nodes, tree_from, tree_to, values, queries):
from collections import defaultdict, deque
# Build adjacency list
g = defaultdict(list)
for u, v in zip(tree_from, tree_to):
g[u].append(v)
g[v].append(u)
# Precompute bitmask for each node using BFS/DFS
mask = [0] * tree_nodes
visited = [False] * tree_nodes
visited[0] = True
stack = [0]
# Set mask for root
mask[0] = 1 << (ord(values[0]) - ord('a'))
while stack:
u = stack.pop()
for v in g[u]:
if not visited[v]:
visited[v] = True
# XOR with character bit of v
mask[v] = mask[u] ^ (1 << (ord(values[v]) - ord('a')))
stack.append(v)
# Answer queries
ans = []
for q in queries:
m = mask[q]
# check ≤ 1 odd frequency
if m & (m - 1) == 0:
ans.append(1)
else:
ans.append(0)
return ans
print(palindromePaths(7, [0,1,2,2,4,4,7], [1,2,3,4,5,6], ['a', 'b', 'c', 'a', 'c','b', 'c'], [6,5,3]))
ZGVmIHBhbGluZHJvbWVQYXRocyh0cmVlX25vZGVzLCB0cmVlX2Zyb20sIHRyZWVfdG8sIHZhbHVlcywgcXVlcmllcyk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdCwgZGVxdWUKICAgIAogICAgIyBCdWlsZCBhZGphY2VuY3kgbGlzdAogICAgZyA9IGRlZmF1bHRkaWN0KGxpc3QpCiAgICBmb3IgdSwgdiBpbiB6aXAodHJlZV9mcm9tLCB0cmVlX3RvKToKICAgICAgICBnW3VdLmFwcGVuZCh2KQogICAgICAgIGdbdl0uYXBwZW5kKHUpCgogICAgIyBQcmVjb21wdXRlIGJpdG1hc2sgZm9yIGVhY2ggbm9kZSB1c2luZyBCRlMvREZTCiAgICBtYXNrID0gWzBdICogdHJlZV9ub2RlcwogICAgdmlzaXRlZCA9IFtGYWxzZV0gKiB0cmVlX25vZGVzCiAgICB2aXNpdGVkWzBdID0gVHJ1ZQogICAgc3RhY2sgPSBbMF0KCiAgICAjIFNldCBtYXNrIGZvciByb290CiAgICBtYXNrWzBdID0gMSA8PCAob3JkKHZhbHVlc1swXSkgLSBvcmQoJ2EnKSkKCiAgICB3aGlsZSBzdGFjazoKICAgICAgICB1ID0gc3RhY2sucG9wKCkKICAgICAgICBmb3IgdiBpbiBnW3VdOgogICAgICAgICAgICBpZiBub3QgdmlzaXRlZFt2XToKICAgICAgICAgICAgICAgIHZpc2l0ZWRbdl0gPSBUcnVlCiAgICAgICAgICAgICAgICAjIFhPUiB3aXRoIGNoYXJhY3RlciBiaXQgb2YgdgogICAgICAgICAgICAgICAgbWFza1t2XSA9IG1hc2tbdV0gXiAoMSA8PCAob3JkKHZhbHVlc1t2XSkgLSBvcmQoJ2EnKSkpCiAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQodikKCiAgICAjIEFuc3dlciBxdWVyaWVzCiAgICBhbnMgPSBbXQogICAgZm9yIHEgaW4gcXVlcmllczoKICAgICAgICBtID0gbWFza1txXQogICAgICAgICMgY2hlY2sg4omkIDEgb2RkIGZyZXF1ZW5jeQogICAgICAgIGlmIG0gJiAobSAtIDEpID09IDA6CiAgICAgICAgICAgIGFucy5hcHBlbmQoMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhbnMuYXBwZW5kKDApCgogICAgcmV0dXJuIGFucwogICAgCnByaW50KHBhbGluZHJvbWVQYXRocyg3LCBbMCwxLDIsMiw0LDQsN10sIFsxLDIsMyw0LDUsNl0sIFsnYScsICdiJywgJ2MnLCAnYScsICdjJywnYicsICdjJ10sIFs2LDUsM10pKQ==