← Home
For problem statement at 1000-1999/1900-1999/1940-1949/1949/problemD.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1940-1949/1949/verifierD.go ends with wrong answer on test 1
input:
4
SFSF
SSF?
FSFS
?SS?
expected:SFSF
SSFF
FSFS
?FS?
got:.FSF
S.FS
FS.S
FSS.

exit status 1 can you fix the verifier? package main

import (
	"fmt"
)

var (
	n     int
	K     int
	grid  []string
	color []int
	adjF  [][]int
	adjS  [][]int
	found bool
	ansA  []int
)

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func dfsA(u int, c0 int, c1 int, kS int) {
	if found {
		return
	}
	if c0 > K+1 || c1 > K+1 {
		return
	}
	if u == n {
		if 2*min(c0, c1)+kS <= K {
			found = true
			ansA = make([]int, n)
			copy(ansA, color)
		}
		return
	}

	valid0 := true
	kS_add0 := 0
	for _, v := range adjF[u] {
		if v < u && color[v] != 0 {
			valid0 = false
			break
		}
	}
	if valid0 {
		for _, v := range adjS[u] {
			if v < u && color[v] == 0 {
				kS_add0++
			}
		}
		color[u] = 0
		dfsA(u+1, c0+1, c1, kS+kS_add0)
	}

	if found {
		return
	}
	valid1 := true
	kS_add1 := 0
	for _, v := range adjF[u] {
		if v < u && color[v] != 1 {
			valid1 = false
			break
		}
	}
	if valid1 {
		for _, v := range adjS[u] {
			if v < u && color[v] == 1 {
				kS_add1++
			}
		}
		color[u] = 1
		dfsA(u+1, c0, c1+1, kS+kS_add1)
	}
}

func dfsB(u int, c0 int, c1 int, kF int) {
	if found {
		return
	}
	if c0 > K+1 || c1 > K+1 {
		return
	}
	if u == n {
		if 2*min(c0, c1)+kF <= K {
			found = true
			ansA = make([]int, n)
			copy(ansA, color)
		}
		return
	}

	valid0 := true
	kF_add0 := 0
	for _, v := range adjS[u] {
		if v < u && color[v] != 0 {
			valid0 = false
			break
		}
	}
	if valid0 {
		for _, v := range adjF[u] {
			if v < u && color[v] == 0 {
				kF_add0++
			}
		}
		color[u] = 0
		dfsB(u+1, c0+1, c1, kF+kF_add0)
	}

	if found {
		return
	}
	valid1 := true
	kF_add1 := 0
	for _, v := range adjS[u] {
		if v < u && color[v] != 1 {
			valid1 = false
			break
		}
	}
	if valid1 {
		for _, v := range adjF[u] {
			if v < u && color[v] == 1 {
				kF_add1++
			}
		}
		color[u] = 1
		dfsB(u+1, c0, c1+1, kF+kF_add1)
	}
}

func main() {
	if _, err := fmt.Scan(&n); err != nil {
		return
	}

	K = (3*n + 3) / 4

	grid = make([]string, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&grid[i])
	}

	adjF = make([][]int, n)
	adjS = make([][]int, n)
	for i := 0; i < n; i++ {
		for j := 0; j < n; j++ {
			if i == j {
				continue
			}
			if grid[i][j] == 'F' {
				adjF[i] = append(adjF[i], j)
			} else if grid[i][j] == 'S' {
				adjS[i] = append(adjS[i], j)
			}
		}
	}

	color = make([]int, n)
	found = false
	dfsA(0, 0, 0, 0)
	mode := 'A'
	if !found {
		dfsB(0, 0, 0, 0)
		mode = 'B'
	}

	for i := 0; i < n; i++ {
		out := make([]byte, n)
		for j := 0; j < n; j++ {
			if i == j {
				out[j] = '.'
			} else {
				if grid[i][j] != '?' {
					out[j] = grid[i][j]
				} else {
					if mode == 'A' {
						if ansA[i] == ansA[j] {
							out[j] = 'F'
						} else {
							out[j] = 'S'
						}
					} else {
						if ansA[i] == ansA[j] {
							out[j] = 'S'
						} else {
							out[j] = 'F'
						}
					}
				}
			}
		}
		fmt.Println(string(out))
	}
}