← Home
For problem statement at 0-999/900-999/900-909/903/problemF.txt this is a correct solution, but verifier at 0-999/900-999/900-909/903/verifierF.go ends with All tests passed can you fix the verifier? ```go
package main

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

const INF = 1 << 30

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	readInt := func() int {
		scanner.Scan()
		x := 0
		for _, b := range scanner.Bytes() {
			x = x*10 + int(b-'0')
		}
		return x
	}

	n := readInt()
	a := make([]int, 4)
	for i := 0; i < 4; i++ {
		a[i] = readInt()
	}

	grid := make([]string, 4)
	for i := 0; i < 4; i++ {
		scanner.Scan()
		grid[i] = scanner.Text()
	}

	ast := make([]int, n)
	for j := 0; j < n; j++ {
		mask := 0
		for i := 0; i < 4; i++ {
			if grid[i][j] == '*' {
				mask |= 1 << i
			}
		}
		ast[j] = mask
	}

	type Square struct {
		cover int
		m1    int
		m2    int
		m3    int
		cost  int
	}
	squares := make([]Square, 0, 10)

	for r := 0; r < 4; r++ {
		squares = append(squares, Square{1 << r, 0, 0, 0, a[0]})
	}
	for r := 0; r < 3; r++ {
		mask := (1 << r) | (1 << (r + 1))
		squares = append(squares, Square{mask, mask, 0, 0, a[1]})
	}
	for r := 0; r < 2; r++ {
		mask := (1 << r) | (1 << (r + 1)) | (1 << (r + 2))
		squares = append(squares, Square{mask, mask, mask, 0, a[2]})
	}
	squares = append(squares, Square{0b1111, 0b1111, 0b1111, 0b1111, a[3]})

	m1List := []int{0, 3, 6, 12, 7, 14, 15}
	m2List := []int{0, 7, 14, 15}
	m3List := []int{0, 15}

	m1Idx := make([]int, 16)
	m2Idx := make([]int, 16)
	m3Idx := make([]int, 16)
	for i := range m1Idx {
		m1Idx[i] = -1
	}
	for i := range m2Idx {
		m2Idx[i] = -1
	}
	for i := range m3Idx {
		m3Idx[i] = -1
	}
	for i, v := range m1List {
		m1Idx[v] = i
	}
	for i, v := range m2List {
		m2Idx[v] = i
	}
	for i, v := range m3List {
		m3Idx[v] = i
	}

	trans := make([][]int, 16)
	for i := range trans {
		trans[i] = make([]int, 64)
		for j := range trans[i] {
			trans[i][j] = INF
		}
	}

	for s := 0; s < (1 << 10); s++ {
		cover := 0
		m1, m2, m3 := 0, 0, 0
		cost := 0
		for i := 0; i < 10; i++ {
			if s&(1<<i) != 0 {
				sq := squares[i]
				cover |= sq.cover
				m1 |= sq.m1
				m2 |= sq.m2
				m3 |= sq.m3
				cost += sq.cost
			}
		}
		i1 := m1Idx[m1]
		i2 := m2Idx[m2]
		i3 := m3Idx[m3]
		if i1 < 0 || i2 < 0 || i3 < 0 {
			continue
		}
		id := (i1*4 + i2) * 2 + i3

		sub := cover
		for {
			need := sub
			if cost < trans[need][id] {
				trans[need][id] = cost
			}
			if sub == 0 {
				break
			}
			sub = (sub - 1) & cover
		}
	}

	idToM1 := make([]int, 64)
	idToM2 := make([]int, 64)
	idToM3 := make([]int, 64)
	for i1, m1 := range m1List {
		for i2, m2 := range m2List {
			for i3, m3 := range m3List {
				id := (i1*4 + i2) * 2 + i3
				idToM1[id] = m1
				idToM2[id] = m2
				idToM3[id] = m3
			}
		}
	}

	dp := [16][16][16]int{}
	newDp := [16][16][16]int{}
	for i := 0; i < 16; i++ {
		for j := 0; j < 16; j++ {
			for k := 0; k < 16; k++ {
				dp[i][j][k] = INF
			}
		}
	}
	dp[0][0][0] = 0

	for col := 0; col < n; col++ {
		A := ast[col]
		for i := 0; i < 16; i++ {
			for j := 0; j < 16; j++ {
				for k := 0; k < 16; k++ {
					newDp[i][j][k] = INF
				}
			}
		}

		for c0 := 0; c0 < 16; c0++ {
			for c1 := 0; c1 < 16; c1++ {
				for c2 := 0; c2 < 16; c2++ {
					cur := dp[c0][c1][c2]
					if cur == INF {
						continue
					}
					need := A & (^c0)
					for id := 0; id < 64; id++ {
						add := trans[need][id]
						if add == INF {
							continue
						}
						nc0 := c1 | idToM1[id]
						nc1 := c2 | idToM2[id]
						nc2 := idToM3[id]
						val := cur + add
						if val < newDp[nc0][nc1][nc2] {
							newDp[nc0][nc1][nc2] = val
						}
					}
				}
			}
		}
		dp = newDp
	}

	ans := INF
	for i := 0; i < 16; i++ {
		for j := 0; j < 16; j++ {
			for k := 0; k < 16; k++ {
				if dp[i][j][k] < ans {
					ans = dp[i][j][k]
				}
			}
		}
	}
	fmt.Println(ans)
}
```