← Home
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	buf, _ := io.ReadAll(os.Stdin)
	pos := 0

	nextInt := func() int {
		for pos < len(buf) && (buf[pos] < '0' || buf[pos] > '9') {
			pos++
		}
		if pos >= len(buf) {
			return 0
		}
		res := 0
		for pos < len(buf) && buf[pos] >= '0' && buf[pos] <= '9' {
			res = res*10 + int(buf[pos]-'0')
			pos++
		}
		return res
	}

	n := nextInt()
	if n == 0 {
		return
	}

	a := make([]int, n+1)
	for i := 1; i <= n; i++ {
		a[i] = nextInt()
	}

	adj := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		u := nextInt()
		v := nextInt()
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}

	type childRes struct {
		V  map[int]struct{}
		dp int
	}

	var solve func(u, p, curXOR int) (map[int]struct{}, int)
	solve = func(u, p, curXOR int) (map[int]struct{}, int) {
		curXOR ^= a[u]

		var children []int
		for _, v := range adj[u] {
			if v != p {
				children = append(children, v)
			}
		}

		if len(children) == 0 {
			res := make(map[int]struct{}, 1)
			res[curXOR] = struct{}{}
			return res, 0
		}

		var resList []childRes
		dpSum := 0
		for _, v := range children {
			V, dp := solve(v, u, curXOR)
			resList = append(resList, childRes{V, dp})
			dpSum += dp
		}

		maxSize := -1
		largestIdx := -1
		for i, res := range resList {
			if len(res.V) > maxSize {
				maxSize = len(res.V)
				largestIdx = i
			}
		}

		L := resList[largestIdx].V
		freq := make(map[int]int)

		for i, res := range resList {
			if i == largestIdx {
				continue
			}
			for x := range res.V {
				freq[x]++
			}
		}

		maxFreq := 1
		for x, c := range freq {
			if _, ok := L[x]; ok {
				c++
			}
			if c > maxFreq {
				maxFreq = c
			}
		}

		k := len(children)

		if u == 1 {
			freqOfZero := 0
			if _, ok := L[0]; ok {
				freqOfZero = 1
			}
			if c, ok := freq[0]; ok {
				freqOfZero += c
			}

			cost1 := k - freqOfZero
			cost2 := k - maxFreq + 1
			if cost2 < cost1 {
				cost1 = cost2
			}
			return nil, dpSum + cost1
		}

		dp_u := dpSum + k - maxFreq
		if maxFreq == 1 {
			for i, res := range resList {
				if i == largestIdx {
					continue
				}
				for x := range res.V {
					L[x] = struct{}{}
				}
			}
			return L, dp_u
		}

		R := make(map[int]struct{})
		for x, c := range freq {
			if _, ok := L[x]; ok {
				c++
			}
			if c == maxFreq {
				R[x] = struct{}{}
			}
		}
		return R, dp_u
	}

	_, ans := solve(1, 0, 0)
	fmt.Println(ans)
}