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