Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 91011 1213func CF1218D(_r io.Reader, out io.Writer) {14 in := bufio.NewReader(_r)15 const mod = 1e9 + 716 const inv2 = (mod + 1) / 217 const mx = 1 << 1718 fwt := func(a []int) {19 for l, k := 2, 1; l <= mx; l, k = l<<1, k<<1 {20 for i := 0; i < mx; i += l {21 for j := 0; j < k; j++ {22 a[i+j], a[i+j+k] = (a[i+j]+a[i+j+k])%mod, (a[i+j]-a[i+j+k])%mod23 }24 }25 }26 }27 ifwt := func(a []int) {28 for l, k := 2, 1; l <= mx; l, k = l<<1, k<<1 {29 for i := 0; i < mx; i += l {30 for j := 0; j < k; j++ {31 a[i+j], a[i+j+k] = int(int64(a[i+j]+a[i+j+k])*inv2%mod), int(int64(a[i+j]-a[i+j+k])*inv2%mod)32 }33 }34 }35 }36 37 var n, m, v, w, wt, xor int38 Fscan(in, &n, &m)39 type nb struct{ to, wt int }40 g := make([][]nb, n+1)41 for ; m > 0; m-- {42 Fscan(in, &v, &w, &wt)43 g[v] = append(g[v], nb{w, wt})44 g[w] = append(g[w], nb{v, wt})45 xor ^= wt46 }47 48 49 cnt := [][]int{}50 s := []nb{{1, 0}}51 vis := make([]int8, n+1)52 var f func(int, int)53 f = func(v, fa int) {54 vis[v] = 155 for _, e := range g[v] {56 if w := e.to; vis[w] == 0 {57 s = append(s, e)58 f(w, v)59 } else if w != fa && vis[w] == 1 {60 c := make([]int, mx)61 for i := len(s) - 1; s[i].to != w; i-- {62 c[s[i].wt]++63 }64 c[e.wt]++65 cnt = append(cnt, c)66 }67 }68 vis[v] = 269 s = s[:len(s)-1]70 }71 f(1, 0)72 73 has := make([]int, mx)74 for i, c := range cnt[0] {75 if c != 0 {76 has[i] = 177 }78 }79 for _, c := range cnt {80 fwt(c)81 }82 for _, c := range cnt[1:] {83 fwt(has)84 for j, v := range c {85 cnt[0][j] = int(int64(cnt[0][j]) * int64(v) % mod)86 has[j] = int(int64(has[j]) * int64(v) % mod)87 }88 ifwt(has)89 for i, v := range has {90 if v != 0 {91 has[i] = 192 }93 }94 }95 ifwt(cnt[0])96 97 for i := 0; ; i++ {98 if has[xor^i] != 0 {99 Fprint(out, i, (cnt[0][xor^i]+mod)%mod)100 break101 }102 }103}104 105106