For problem statement at 0-999/700-799/710-719/718/problemD.txt this is a correct solution, but verifier at 0-999/700-799/710-719/718/verifierD.go ends with All 100 tests passed can you fix the verifier? package main
import (
"fmt"
"io"
"os"
)
func f(x uint64) uint64 {
x += 0x9e3779b97f4a7c15
x ^= x >> 30
x *= 0xbf58476d1ce4e5b9
x ^= x >> 27
x *= 0x94d049bb133111eb
x ^= x >> 31
return x
}
type HashKey struct {
h1, h2 uint64
}
func get_key(h1, h2 uint64) HashKey {
if h1 > h2 {
h1, h2 = h2, h1
}
return HashKey{h1, h2}
}
func main() {
data, _ := io.ReadAll(os.Stdin)
off := 0
readInt := func() int {
for off < len(data) && (data[off] < '0' || data[off] > '9') {
off++
}
if off >= len(data) {
return 0
}
res := 0
for off < len(data) && data[off] >= '0' && data[off] <= '9' {
res = res*10 + int(data[off]-'0')
off++
}
return res
}
n := readInt()
if n == 0 {
return
}
if n == 1 {
fmt.Println(1)
return
}
adj := make([][]int, n+1)
deg := make([]int, n+1)
for i := 0; i < n-1; i++ {
u := readInt()
v := readInt()
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
deg[u]++
deg[v]++
}
sz := make([]int, n+1)
var find_centroid func(v, p int)
C := -1
find_centroid = func(v, p int) {
sz[v] = 1
isC := true
for _, w := range adj[v] {
if w != p {
find_centroid(w, v)
sz[v] += sz[w]
if sz[w] > n/2 {
isC = false
}
}
}
if n-sz[v] > n/2 {
isC = false
}
if isC {
C = v
}
}
find_centroid(1, 0)
parent := make([]int, n+1)
sz = make([]int, n+1)
base := make([]uint64, n+1)
old_hash := make([]uint64, n+1)
var dfs func(v, p int)
dfs = func(v, p int) {
parent[v] = p
sz[v] = 1
base[v] = 0
for _, w := range adj[v] {
if w != p {
dfs(w, v)
sz[v] += sz[w]
base[v] += f(old_hash[w])
}
}
old_hash[v] = base[v]
}
dfs(C, 0)
vdir := make([]int, n+1)
prop_base := make([]uint64, n+1)
var dfs_prop func(v, p, vd int)
dfs_prop = func(v, p, vd int) {
vdir[v] = vd
if p != 0 {
prop_base[v] = base[p] - f(old_hash[v])
}
for _, w := range adj[v] {
if w != p {
next_vd := vd
if v == C {
next_vd = w
}
dfs_prop(w, v, next_vd)
}
}
}
dfs_prop(C, 0, 0)
unique_hashes := make(map[HashKey]struct{})
f_0 := f(0)
for u := 1; u <= n; u++ {
if deg[u] >= 4 {
continue
}
h := base[u] + f_0
curr := u
var mod_vdir uint64
if curr != C {
for parent[curr] != C {
h = prop_base[curr] + f(h)
curr = parent[curr]
}
mod_vdir = h
h = prop_base[curr] + f(h)
}
mod_C := h
vd := vdir[u]
var key HashKey
if vd != 0 {
if n%2 == 0 && sz[vd] == n/2 {
h_vdir := mod_vdir + f(base[C]-f(old_hash[vd]))
key = HashKey{h_vdir, h_vdir}
} else if n%2 == 1 && sz[vd] == n/2 {
h_vdir := mod_vdir + f(base[C]-f(old_hash[vd]))
key = get_key(mod_C, h_vdir)
} else {
key = HashKey{mod_C, mod_C}
}
} else {
key = HashKey{mod_C, mod_C}
}
unique_hashes[key] = struct{}{}
}
fmt.Println(len(unique_hashes))
}