← Home
For problem statement at 2000-2999/2000-2099/2090-2099/2091/problemF.txt this is a correct solution, but verifier at 2000-2999/2000-2099/2090-2099/2091/verifierF.go ends with All 83 tests passed can you fix the verifier?  ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD int64 = 998244353

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var t int
	fmt.Fscan(in, &t)
	for tc := 0; tc < t; tc++ {
		var n, m, d int
		fmt.Fscan(in, &n, &m, &d)
		rows := make([][]int, n)
		for i := 0; i < n; i++ {
			var s string
			fmt.Fscan(in, &s)
			for j, ch := range s {
				if ch == 'X' {
					rows[i] = append(rows[i], j)
				}
			}
		}

		valid := true
		for i := 0; i < n; i++ {
			if len(rows[i]) == 0 {
				valid = false
				break
			}
		}
		if !valid {
			fmt.Fprintln(out, 0)
			continue
		}

		horiz := d
		vert := d - 1

		prevCols := rows[n-1]
		k := len(prevCols)
		prevVals := make([]int64, k)

		L := 0
		R := -1
		for idx := 0; idx < k; idx++ {
			col := prevCols[idx]
			maxCol := col + horiz
			minCol := col - horiz
			for R+1 < k && prevCols[R+1] <= maxCol {
				R++
			}
			for L <= R && prevCols[L] < minCol {
				L++
			}
			if L <= R {
				prevVals[idx] = int64(R-L+1) % MOD
			} else {
				prevVals[idx] = 0
			}
		}

		for i := n - 2; i >= 0; i-- {
			currCols := rows[i]
			kCurr := len(currCols)

			gVals := make([]int64, kCurr)

			prefixPrev := make([]int64, len(prevVals)+1)
			for j := 0; j < len(prevVals); j++ {
				prefixPrev[j+1] = (prefixPrev[j] + prevVals[j]) % MOD
			}

			Lp := 0
			Rp := -1
			for idx := 0; idx < kCurr; idx++ {
				col := currCols[idx]
				maxCol := col + vert
				minCol := col - vert
				for Rp+1 < len(prevCols) && prevCols[Rp+1] <= maxCol {
					Rp++
				}
				for Lp <= Rp && prevCols[Lp] < minCol {
					Lp++
				}
				if Lp <= Rp {
					gVals[idx] = (prefixPrev[Rp+1] - prefixPrev[Lp] + MOD) % MOD
				} else {
					gVals[idx] = 0
				}
			}

			newVals := make([]int64, kCurr)

			prefixG := make([]int64, kCurr+1)
			for j := 0; j < kCurr; j++ {
				prefixG[j+1] = (prefixG[j] + gVals[j]) % MOD
			}

			Lc := 0
			Rc := -1
			for idx := 0; idx < kCurr; idx++ {
				col := currCols[idx]
				maxCol := col + horiz
				minCol := col - horiz
				for Rc+1 < kCurr && currCols[Rc+1] <= maxCol {
					Rc++
				}
				for Lc <= Rc && currCols[Lc] < minCol {
					Lc++
				}
				if Lc <= Rc {
					newVals[idx] = (prefixG[Rc+1] - prefixG[Lc] + MOD) % MOD
				} else {
					newVals[idx] = 0
				}
			}

			prevCols = currCols
			prevVals = newVals
		}

		ans := int64(0)
		for _, v := range prevVals {
			ans = (ans + v) % MOD
		}
		fmt.Fprintln(out, ans)
	}
}
```