← Home
For problem statement at 0-999/0-99/90-99/98/problemD.txt this is a correct solution, but verifier at 0-999/0-99/90-99/98/verifierD.go ends with All tests passed can you fix the verifier? ```go
package main

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

type Decision struct {
	cost  int
	strat int
	use_R int
}

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

	var n int
	if _, err := fmt.Fscan(in, &n); err != nil || n == 0 {
		return
	}

	d := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &d[i])
	}

	sizes := []int{0}
	current_size := 1
	for i := n - 2; i >= 0; i-- {
		if d[i] == d[i+1] {
			current_size++
		} else {
			sizes = append(sizes, current_size)
			current_size = 1
		}
	}
	sizes = append(sizes, current_size)

	k := len(sizes) - 1
	DP_P := make([]Decision, k+1)
	DP_R := make([]Decision, k+1)
	DP_P[0] = Decision{0, 0, 0}
	DP_R[0] = Decision{0, 0, 0}

	for i := 1; i <= k; i++ {
		c := sizes[i]

		cost_R_P := 2*DP_P[i-1].cost + c
		cost_R_R := 2*DP_R[i-1].cost + c
		if cost_R_P <= cost_R_R {
			DP_R[i] = Decision{cost_R_P, 1, 0}
		} else {
			DP_R[i] = Decision{cost_R_R, 1, 2}
		}

		if c == 1 {
			DP_P[i] = DP_R[i]
		} else {
			cost2_P := 3*DP_P[i-1].cost + 2*c
			cost2_R := DP_P[i-1].cost + 2*DP_R[i-1].cost + 2*c
			best2 := cost2_P
			use_R_2 := 0
			if cost2_R < best2 {
				best2 = cost2_R
				use_R_2 = 2
			}

			cost3_P := 4*DP_P[i-1].cost + 2*c - 1
			cost3_R2 := 2*DP_P[i-1].cost + 2*DP_R[i-1].cost + 2*c - 1
			cost3_R4 := 4*DP_R[i-1].cost + 2*c - 1

			best3 := cost3_P
			use_R_3 := 0
			if cost3_R2 < best3 {
				best3 = cost3_R2
				use_R_3 = 2
			}
			if cost3_R4 < best3 {
				best3 = cost3_R4
				use_R_3 = 4
			}

			if best2 <= best3 {
				DP_P[i] = Decision{best2, 2, use_R_2}
			} else {
				DP_P[i] = Decision{best3, 3, use_R_3}
			}
		}
	}

	fmt.Fprintln(out, DP_P[k].cost)

	var solve_P func(i, S, T, A int)
	var solve_R func(i, S, T, A int)

	move_disks := func(cnt, S, T int) {
		for j := 0; j < cnt; j++ {
			fmt.Fprintln(out, S, T)
		}
	}

	solve_P = func(i, S, T, A int) {
		if i == 0 {
			return
		}
		c := sizes[i]
		dec := DP_P[i]

		if dec.strat == 1 {
			if dec.use_R == 0 {
				solve_P(i-1, S, A, T)
				move_disks(c, S, T)
				solve_P(i-1, A, T, S)
			} else {
				solve_R(i-1, S, A, T)
				move_disks(c, S, T)
				solve_R(i-1, A, T, S)
			}
		} else if dec.strat == 2 {
			if dec.use_R == 0 {
				solve_P(i-1, S, T, A)
				move_disks(c, S, A)
				solve_P(i-1, T, S, A)
				move_disks(c, A, T)
				solve_P(i-1, S, T, A)
			} else {
				solve_R(i-1, S, T, A)
				move_disks(c, S, A)
				solve_R(i-1, T, S, A)
				move_disks(c, A, T)
				solve_P(i-1, S, T, A)
			}
		} else if dec.strat == 3 {
			if dec.use_R == 0 {
				solve_P(i-1, S, T, A)
				move_disks(c-1, S, A)
				solve_P(i-1, T, A, S)
				move_disks(1, S, T)
				solve_P(i-1, A, S, T)
				move_disks(c-1, A, T)
				solve_P(i-1, S, T, A)
			} else if dec.use_R == 2 {
				solve_R(i-1, S, T, A)
				move_disks(c-1, S, A)
				solve_R(i-1, T, A, S)
				move_disks(1, S, T)
				solve_P(i-1, A, S, T)
				move_disks(c-1, A, T)
				solve_P(i-1, S, T, A)
			} else {
				solve_R(i-1, S, T, A)
				move_disks(c-1, S, A)
				solve_R(i-1, T, A, S)
				move_disks(1, S, T)
				solve_R(i-1, A, S, T)
				move_disks(c-1, A, T)
				solve_R(i-1, S, T, A)
			}
		}
	}

	solve_R = func(i, S, T, A int) {
		if i == 0 {
			return
		}
		c := sizes[i]
		dec := DP_R[i]
		if dec.use_R == 0 {
			solve_P(i-1, S, A, T)
			move_disks(c, S, T)
			solve_P(i-1, A, T, S)
		} else {
			solve_R(i-1, S, A, T)
			move_disks(c, S, T)
			solve_R(i-1, A, T, S)
		}
	}

	solve_P(k, 1, 3, 2)
}
```