Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math"8)9 1011func cf914E(_r io.Reader, out io.Writer) {12 in := bufio.NewReader(_r)13 var n int14 var s string15 Fscan(in, &n)16 g := make([][]int, n)17 for i := 1; i < n; i++ {18 var v, w int19 Fscan(in, &v, &w)20 v--21 w--22 g[v] = append(g[v], w)23 g[w] = append(g[w], v)24 }25 Fscan(in, &s)26 27 deleted := make([]bool, n)28 size := make([]int, n)29 var findCentroid func(int, int, int) (int, int, int)30 findCentroid = func(v, fa, compSize int) (minSize, ct, faCt int) {31 minSize = math.MaxInt32 maxSubSize := 033 size[v] = 134 for _, w := range g[v] {35 if w != fa && !deleted[w] {36 minSizeW, ctW, faCtW := findCentroid(w, v, compSize)37 if minSizeW < minSize {38 minSize, ct, faCt = minSizeW, ctW, faCtW39 }40 maxSubSize = max(maxSubSize, size[w])41 size[v] += size[w]42 }43 }44 maxSubSize = max(maxSubSize, compSize-size[v])45 if maxSubSize < minSize {46 minSize, ct, faCt = maxSubSize, v, fa47 }48 return49 }50 51 ans := make([]int, n)52 cnt := [1 << 20]int{}53 54 55 var updateCC func(int, int, int, int)56 updateCC = func(v, fa, delta, mask int) {57 mask ^= 1 << (s[v] - 'a')58 cnt[mask] += delta59 for _, w := range g[v] {60 if w != fa && !deleted[w] {61 updateCC(w, v, delta, mask)62 }63 }64 }65 66 67 var calc func(int, int, int) int68 calc = func(v, fa, mask int) int {69 mask ^= 1 << (s[v] - 'a')70 71 res := cnt[mask]72 for i := 1; i < len(cnt); i <<= 1 {73 res += cnt[mask^i]74 }75 76 for _, w := range g[v] {77 if w != fa && !deleted[w] {78 res += calc(w, v, mask)79 }80 }81 ans[v] += res82 return res83 }84 85 var dfs func(int, int, int)86 dfs = func(v, fa, compSize int) {87 _, ct, faCt := findCentroid(v, fa, compSize)88 89 updateCC(ct, -1, 1, 0)90 91 res := cnt[0]92 for i := 1; i < len(cnt); i <<= 1 {93 res += cnt[i]94 }95 96 for _, w := range g[ct] {97 if deleted[w] {98 continue99 }100 101 updateCC(w, ct, -1, 1<<(s[ct]-'a'))102 res += calc(w, ct, 0)103 updateCC(w, ct, 1, 1<<(s[ct]-'a'))104 }105 ans[ct] += res / 2 106 updateCC(ct, -1, -1, 0)107 108 deleted[ct] = true109 for _, w := range g[ct] {110 if !deleted[w] {111 if w != faCt {112 dfs(w, ct, size[w])113 } else {114 dfs(w, ct, compSize-size[ct])115 }116 }117 }118 }119 dfs(0, -1, n)120 for _, v := range ans {121 Fprint(out, v+1, " ")122 }123}124 125126