← Home
package main

import (
	"io"
	"os"
	"strconv"
)

type FastScanner struct {
	data []byte
	idx  int
}

func (fs *FastScanner) skip() {
	for fs.idx < len(fs.data) && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
}

func (fs *FastScanner) NextUint64() uint64 {
	fs.skip()
	var v uint64
	for fs.idx < len(fs.data) {
		b := fs.data[fs.idx]
		if b < '0' || b > '9' {
			break
		}
		v = v*10 + uint64(b-'0')
		fs.idx++
	}
	return v
}

func (fs *FastScanner) NextString() string {
	fs.skip()
	start := fs.idx
	for fs.idx < len(fs.data) && fs.data[fs.idx] > ' ' {
		fs.idx++
	}
	return string(fs.data[start:fs.idx])
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	fs := FastScanner{data: data}

	t := int(fs.NextUint64())
	out := make([]byte, 0, t*24)

	for ; t > 0; t-- {
		n := int(fs.NextUint64())

		a := make([]uint64, n)
		d := make([]uint64, n)

		var base uint64
		for i := 0; i < n; i++ {
			a[i] = fs.NextUint64()
			base ^= a[i]
		}
		for i := 0; i < n; i++ {
			b := fs.NextUint64()
			d[i] = a[i] ^ b
		}
		c := fs.NextString()

		var basis [60]uint64
		var owner [60]byte

		for i := n - 1; i >= 0; i-- {
			v := d[i]
			for bit := 59; bit >= 0 && v != 0; bit-- {
				if ((v >> uint(bit)) & 1) == 0 {
					continue
				}
				if basis[bit] == 0 {
					basis[bit] = v
					owner[bit] = c[i]
					break
				}
				v ^= basis[bit]
			}
		}

		ans := base
		for bit := 59; bit >= 0; bit-- {
			if basis[bit] == 0 {
				continue
			}
			cur := (ans >> uint(bit)) & 1
			if owner[bit] == '0' {
				if cur == 1 {
					ans ^= basis[bit]
				}
			} else {
				if cur == 0 {
					ans ^= basis[bit]
				}
			}
		}

		out = strconv.AppendUint(out, ans, 10)
		out = append(out, '\n')
	}

	_, _ = os.Stdout.Write(out)
}