← Home
For problem statement at 0-999/600-699/600-609/607/problemC.txt this is a correct solution, but verifier at 0-999/600-699/600-609/607/verifierC.go ends with case 1 failed: expected YES got NO
exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"io"
	"os"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0

	nextToken := func() []byte {
		for p < len(data) && (data[p] == ' ' || data[p] == '\n' || data[p] == '\r' || data[p] == '\t') {
			p++
		}
		start := p
		for p < len(data) && data[p] != ' ' && data[p] != '\n' && data[p] != '\r' && data[p] != '\t' {
			p++
		}
		return data[start:p]
	}

	parseInt := func(b []byte) int {
		v := 0
		for _, c := range b {
			v = v*10 + int(c-'0')
		}
		return v
	}

	dir := func(c byte) byte {
		switch c {
		case 'N':
			return 0
		case 'E':
			return 1
		case 'S':
			return 2
		default:
			return 3
		}
	}

	n := parseInt(nextToken())
	sa := nextToken()
	sb := nextToken()
	m := n - 1

	a := make([]byte, m)
	b := make([]byte, m)
	for i := 0; i < m; i++ {
		a[i] = dir(sa[i])
		b[i] = dir(sb[i])
	}

	nextPos := [4][]int{}
	for d := 0; d < 4; d++ {
		nextPos[d] = make([]int, m+1)
		nextPos[d][m] = m
	}
	for i := m - 1; i >= 0; i-- {
		nextPos[0][i] = nextPos[0][i+1]
		nextPos[1][i] = nextPos[1][i+1]
		nextPos[2][i] = nextPos[2][i+1]
		nextPos[3][i] = nextPos[3][i+1]
		nextPos[b[i]][i] = i
	}

	opp := [4]int{2, 3, 0, 1}
	inf := m + 1

	dp := [5]int{inf, inf, inf, inf, inf}
	dp[4] = 0

	for i := 0; i < m; i++ {
		x := int(a[i])
		prev := -1
		if i > 0 {
			prev = int(a[i-1])
		}

		ndp := [5]int{inf, inf, inf, inf, inf}

		for t := 0; t < 5; t++ {
			j := dp[t]
			if j == inf {
				continue
			}

			nx := nextPos[x][j]
			no := m
			if i > 0 {
				no = nextPos[opp[prev]][j]
			}

			expMax := -1
			sim := -1
			if nx < no {
				expMax = nx - 1
				sim = nx
			} else {
				expMax = no
			}

			if expMax >= j {
				if j == 0 {
					if 0 < ndp[4] {
						ndp[4] = 0
					}
				} else if t != opp[x] {
					if j < ndp[t] {
						ndp[t] = j
					}
				}

				badTop := opp[x]
				for d := 0; d < 4; d++ {
					if d == badTop {
						continue
					}
					pos := nextPos[d][j]
					if pos < expMax {
						cand := pos + 1
						if cand < ndp[d] {
							ndp[d] = cand
						}
					}
				}
			}

			if sim != -1 {
				cand := sim + 1
				if cand < ndp[x] {
					ndp[x] = cand
				}
			}
		}

		dp = ndp
	}

	bad := opp[int(a[m-1])]
	ok := false
	for t := 0; t < 5; t++ {
		j := dp[t]
		if j == inf {
			continue
		}
		if nextPos[bad][j] == m {
			ok = true
			break
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 16)
	if ok {
		out.WriteString("YES\n")
	} else {
		out.WriteString("NO\n")
	}
	out.Flush()
}