← Home
 ```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	scanner.Scan()
	n, _ := strconv.Atoi(scanner.Text())

	c := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		scanner.Scan()
		val, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		c[i] = val
	}

	scanner.Scan()
	s := scanner.Text()

	adj := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		scanner.Scan()
		u, _ := strconv.Atoi(scanner.Text())
		scanner.Scan()
		v, _ := strconv.Atoi(scanner.Text())
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}

	parent := make([]int, n+1)
	order := make([]int, 0, n)
	stack := []int{1}
	parent[1] = -1
	for len(stack) > 0 {
		v := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		order = append(order, v)
		for _, w := range adj[v] {
			if w != parent[v] {
				parent[w] = v
				stack = append(stack, w)
			}
		}
	}

	randVals := make([]uint64, n+2)
	var x uint64 = 123456789
	for i := 0; i <= n+1; i++ {
		x += 0x9e3779b97f4a7c15
		z := x
		z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9
		z = (z ^ (z >> 27)) * 0x94d049bb133111eb
		randVals[i] = z ^ (z >> 31)
	}

	type Key struct {
		c byte
		h uint64
	}

	memo := make(map[Key]int)
	sizes := make([]int, 0, n+1)
	structID := make([]int, n+1)
	visited := make([]int, n+2)
	stamp := 1

	for i := n - 1; i >= 0; i-- {
		v := order[i]
		var h uint64
		sum := 0
		for _, w := range adj[v] {
			if w == parent[v] {
				continue
			}
			id := structID[w]
			if visited[id] != stamp {
				visited[id] = stamp
				h ^= randVals[id]
				sum += sizes[id]
			}
		}
		stamp++

		key := Key{s[v-1], h}
		if id, ok := memo[key]; ok {
			structID[v] = id
		} else {
			id = len(sizes)
			sizes = append(sizes, 1+sum)
			structID[v] = id
			memo[key] = id
		}
	}

	maxVal := int64(-1 << 62)
	count := 0
	for v := 1; v <= n; v++ {
		val := int64(sizes[structID[v]]) + c[v]
		if val > maxVal {
			maxVal = val
			count = 1
		} else if val == maxVal {
			count++
		}
	}

	fmt.Println(maxVal)
	fmt.Println(count)
}
```