```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)
}
```