```go
package main
import (
"bufio"
"fmt"
"os"
)
func max(a, b int64) int64 {
if a > b {
return a
}
return b
}
func main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
var t int
fmt.Fscan(in, &t)
for ; t > 0; t-- {
var n int
fmt.Fscan(in, &n)
var s string
fmt.Fscan(in, &s)
a := make([]int64, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &a[i])
}
const neg int64 = -1 << 60
dp0, dp1 := int64(0), neg
for i := 0; i < n; i++ {
dp0n, dp1n := neg, neg
if s[i] == '0' {
dp0n = max(dp0, dp1)
} else {
dp0n = max(dp0n, dp0+a[i])
dp1n = max(dp1n, dp0)
dp0n = max(dp0n, dp1+a[i])
dp0n = max(dp0n, dp1+a[i])
}
dp0, dp1 = dp0n, dp1n
}
ans := max(dp0, dp1)
fmt.Fprintln(out, ans)
}
}
```