← Home
For problem statement at 1000-1999/1900-1999/1980-1989/1984/problemF.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1980-1989/1984/verifierF.go ends with case 6 failed
input:
1
4 4
SP??
-10 -6 -6 -5
expected: 1
got: 0

exit status 1 can you fix the verifier? ```go
package main

import "fmt"

func abs(x int64) int64 {
	if x < 0 {
		return -x
	}
	return x
}

func main() {
	var t int
	fmt.Scan(&t)
	const mod = 998244353
	for i := 0; i < t; i++ {
		var n int
		var mm int64
		fmt.Scan(&n, &mm)
		var sstr string
		fmt.Scan(&sstr)
		s := []byte(sstr)
		b := make([]int64, n+1)
		for i := 1; i <= n; i++ {
			fmt.Scan(&b[i])
		}
		pref_good := make([]bool, n+2)
		pref_val := make([]int64, n+2)
		pref_good[1] = true
		pref_val[1] = 0
		good := true
		curr_pref := int64(0)
		for i := 1; i <= n; i++ {
			can := (s[i-1] == '?' || s[i-1] == 'P')
			if good && can && abs(b[i]-curr_pref) <= mm {
				curr_pref = b[i]
				pref_good[i+1] = true
				pref_val[i+1] = curr_pref
			} else {
				good = false
				pref_good[i+1] = false
			}
		}
		ans := int64(0)
		if pref_good[n+1] {
			ans = (ans + 1) % mod
		}
		for k := 1; k <= n; k++ {
			if !pref_good[k] {
				continue
			}
			if s[k-1] != '?' && s[k-1] != 'S' {
				continue
			}
			I := pref_val[k]
			TT := I + b[k]
			length := n - k
			dp := make([][]int64, length+2)
			for i := range dp {
				dp[i] = make([]int64, 2)
			}
			dp[1][1] = 1
			for p := 1; p <= length; p++ {
				j := k + p
				ss := s[j-1]
				for ctype := 0; ctype < 2; ctype++ {
					ww := dp[p][ctype]
					if ww == 0 {
						continue
					}
					last_j := k + p - 1
					var v int64
					if ctype == 0 {
						v = b[last_j]
					} else {
						v = TT - b[last_j]
					}
					for typ := 0; typ < 2; typ++ {
						can_typ := (ss == '?' || (ss == 'P' && typ == 0) || (ss == 'S' && typ == 1))
						if !can_typ {
							continue
						}
						ok := false
						new_v := b[j]
						if typ == 1 {
							new_v = TT - b[j]
						}
						if ctype == typ {
							if abs(new_v-v) <= mm {
								ok = true
							}
						} else {
							if typ == 0 {
								if abs(new_v-v) <= 2*mm {
									ok = true
								}
							} else {
								if v == TT-b[j] {
									ok = true
								}
							}
						}
						if ok {
							dp[p+1][typ] = (dp[p+1][typ] + ww) % mod
						}
					}
				}
			}
			add := int64(0)
			for ctype := 0; ctype < 2; ctype++ {
				ww := dp[length+1][ctype]
				if ww == 0 {
					continue
				}
				last_j := k + length
				var v int64
				if ctype == 0 {
					v = b[last_j]
				} else {
					v = TT - b[last_j]
				}
				ok := false
				if ctype == 0 {
					if v == TT {
						ok = true
					}
				} else {
					if abs(TT-v) <= mm {
						ok = true
					}
				}
				if ok {
					add = (add + ww) % mod
				}
			}
			ans = (ans + add) % mod
		}
		fmt.Println(ans)
	}
}
```