```go
package main
import (
"bufio"
"fmt"
"os"
)
const MOD = 998244353
const MAXN = 200005
var fact, invFact, pow2, inv [MAXN]int
func powMod(a, b int) int {
res := 1
for b > 0 {
if b&1 == 1 {
res = res * a % MOD
}
a = a * a % MOD
b >>= 1
}
return res
}
func init() {
fact[0] = 1
for i := 1; i < MAXN; i++ {
fact[i] = fact[i-1] * i % MOD
}
invFact[MAXN-1] = powMod(fact[MAXN-1], MOD-2)
for i := MAXN - 2; i >= 0; i-- {
invFact[i] = invFact[i+1] * (i + 1) % MOD
}
pow2[0] = 1
for i := 1; i < MAXN; i++ {
pow2[i] = pow2[i-1] * 2 % MOD
}
inv[1] = 1
for i := 2; i < MAXN; i++ {
inv[i] = MOD - MOD/i*inv[MOD%i]%MOD
}
}
func C(n, k int) int {
if k < 0 || k > n {
return 0
}
return fact[n] * invFact[k] % MOD * invFact[n-k] % MOD
}
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var t int
fmt.Fscan(reader, &t)
for ; t > 0; t-- {
var n int
var s string
fmt.Fscan(reader, &n)
fmt.Fscan(reader, &s)
zeros := 0
ones := 0
maxL := 0
maxZerosFor1 := 0
ans := 0
for j := 1; j <= n; j++ {
if s[j-1] == '0' {
zeros++
if ones > maxL {
maxL = ones
}
} else {
ones++
if zeros > maxZerosFor1 {
maxZerosFor1 = zeros
}
}
lb := maxL
ub := j - 1 - maxZerosFor1
if lb > ub {
continue
}
var sum int
if lb == 0 && ub == j-1 {
sum = pow2[j-1]
} else {
sum = 0
c := C(j-1, lb)
for h := lb; h <= ub; h++ {
sum = (sum + c) % MOD
if h < ub {
c = c * (j - 1 - h) % MOD * inv[h+1] % MOD
}
}
}
ans = (ans + sum) % MOD
}
fmt.Fprintln(writer, ans)
}
}
```