```go
package main
import (
"bufio"
"fmt"
"os"
)
type FastReader struct {
r *bufio.Reader
}
func NewFastReader() *FastReader {
return &FastReader{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}
func (fr *FastReader) nextByte() byte {
b, _ := fr.r.ReadByte()
return b
}
func (fr *FastReader) NextInt() int {
b := fr.nextByte()
for b <= ' ' {
b = fr.nextByte()
}
sign := 1
if b == '-' {
sign = -1
b = fr.nextByte()
}
val := 0
for b >= '0' && b <= '9' {
val = val*10 + int(b-'0')
b = fr.nextByte()
}
return sign * val
}
func (fr *FastReader) NextString() string {
b := fr.nextByte()
for b <= ' ' {
b = fr.nextByte()
}
buf := make([]byte, 0, 16)
for b > ' ' {
buf = append(buf, b)
b = fr.nextByte()
}
return string(buf)
}
func main() {
in := NewFastReader()
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
t := in.NextInt()
for ; t > 0; t-- {
n := in.NextInt()
s := in.NextString()
sb := []byte(s)
left := make([]int, n+1)
right := make([]int, n+1)
for i := 1; i <= n; i++ {
left[i] = in.NextInt()
right[i] = in.NextInt()
}
cost := make([]int, n+1)
ans := int(1<<60 - 1)
stack := make([]int, 0, n)
stack = append(stack, 1)
for len(stack) > 0 {
v := stack[len(stack)-1]
stack = stack[:len(stack)-1]
lv, rv := left[v], right[v]
if lv == 0 && rv == 0 {
if cost[v] < ans {
ans = cost[v]
}
}
if lv != 0 {
c := cost[v]
if sb[v-1] != 'L' {
c++
}
cost[lv] = c
stack = append(stack, lv)
}
if rv != 0 {
c := cost[v]
if sb[v-1] != 'R' {
c++
}
cost[rv] = c
stack = append(stack, rv)
}
}
fmt.Fprintln(out, ans)
}
}
```