For problem statement at 1000-1999/1000-1099/1010-1019/1015/problemF.txt this is a correct solution, but verifier at 1000-1999/1000-1099/1010-1019/1015/verifierF.go ends with All 100 tests passed can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
)
const MOD int64 = 1000000007
func main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
var n int
var s string
fmt.Fscan(in, &n, &s)
L := 2 * n
m := len(s)
if m > L {
fmt.Println(0)
return
}
pi := make([]int, m)
for i := 1; i < m; i++ {
j := pi[i-1]
for j > 0 && s[i] != s[j] {
j = pi[j-1]
}
if s[i] == s[j] {
j++
}
pi[i] = j
}
next := make([][2]int, m+1)
chars := [2]byte{'(', ')'}
for st := 0; st <= m; st++ {
for c := 0; c < 2; c++ {
j := st
for j > 0 && (j == m || s[j] != chars[c]) {
j = pi[j-1]
}
if j < m && s[j] == chars[c] {
j++
}
next[st][c] = j
}
}
K := m + 1
size := (n + 1) * K * 2
cur := make([]int64, size)
nxt := make([]int64, size)
idx := func(bal, st, found int) int {
return ((bal*K + st) << 1) | found
}
cur[idx(0, 0, 0)] = 1
for pos := 0; pos < L; pos++ {
for i := range nxt {
nxt[i] = 0
}
rem := L - (pos + 1)
for bal := 0; bal <= n; bal++ {
base := bal * K * 2
for st := 0; st <= m; st++ {
off := base + st*2
v0 := cur[off]
if v0 != 0 {
nb := bal + 1
if nb <= n && nb <= rem {
ns := next[st][0]
nf := 0
if ns == m {
nf = 1
}
ni := ((nb*K + ns) << 1) | nf
x := nxt[ni] + v0
if x >= MOD {
x -= MOD
}
nxt[ni] = x
}
if bal > 0 {
nb = bal - 1
if nb <= rem {
ns := next[st][1]
nf := 0
if ns == m {
nf = 1
}
ni := ((nb*K + ns) << 1) | nf
x := nxt[ni] + v0
if x >= MOD {
x -= MOD
}
nxt[ni] = x
}
}
}
v1 := cur[off|1]
if v1 != 0 {
nb := bal + 1
if nb <= n && nb <= rem {
ns := next[st][0]
ni := ((nb*K + ns) << 1) | 1
x := nxt[ni] + v1
if x >= MOD {
x -= MOD
}
nxt[ni] = x
}
if bal > 0 {
nb = bal - 1
if nb <= rem {
ns := next[st][1]
ni := ((nb*K + ns) << 1) | 1
x := nxt[ni] + v1
if x >= MOD {
x -= MOD
}
nxt[ni] = x
}
}
}
}
}
cur, nxt = nxt, cur
}
var ans int64
for st := 0; st <= m; st++ {
ans += cur[idx(0, st, 1)]
if ans >= MOD {
ans -= MOD
}
}
out := bufio.NewWriterSize(os.Stdout, 1<<20)
fmt.Fprintln(out, ans)
out.Flush()
}