← Home
For problem statement at 1000-1999/1500-1599/1540-1549/1545/problemC.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1540-1549/1545/verifierC.go ends with test 1 failed
input:
1
8
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
5 6 7 8 1 2 3 4
6 7 8 1 2 3 4 5
7 8 1 2 3 4 5 6
8 1 2 3 4 5 6 7
2 1 3 4 5 6 7 8
2 3 4 5 6 8 7 1
3 4 5 6 7 8 2 1
4 1 6 7 8 5 2 3
5 6 7 3 1 2 8 4
6 7 8 2 1 3 4 5
5 8 1 2 3 4 7 6
8 1 6 3 4 5 2 7
expected:1
1 2 3 5 6 7 4 8
actual:1
1 7 4 8 6 5 2 3

exit status 1 can you fix the verifier? package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, 10*1024*1024)

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var t int
	if !scanner.Scan() {
		return
	}
	t, _ = strconv.Atoi(scanner.Text())

	for tc := 0; tc < t; tc++ {
		scanner.Scan()
		n, _ := strconv.Atoi(scanner.Text())

		A := make([][]int, 2*n+1)
		for i := 1; i <= 2*n; i++ {
			A[i] = make([]int, n+1)
			for j := 1; j <= n; j++ {
				scanner.Scan()
				A[i][j], _ = strconv.Atoi(scanner.Text())
			}
		}

		available := make([]bool, 2*n+1)
		for i := 1; i <= 2*n; i++ {
			available[i] = true
		}

		covered := make([][]bool, n+1)
		deg := make([][]int, n+1)
		arrays_with := make([][][]int, n+1)
		for i := 1; i <= n; i++ {
			covered[i] = make([]bool, n+1)
			deg[i] = make([]int, n+1)
			arrays_with[i] = make([][]int, n+1)
		}

		for i := 1; i <= 2*n; i++ {
			for c := 1; c <= n; c++ {
				v := A[i][c]
				deg[c][v]++
				arrays_with[c][v] = append(arrays_with[c][v], i)
			}
		}

		q := make([][2]int, 0)
		for c := 1; c <= n; c++ {
			for v := 1; v <= n; v++ {
				if deg[c][v] == 1 {
					q = append(q, [2]int{c, v})
				}
			}
		}

		chosen := make([]int, 0, n)

		for len(q) > 0 {
			item := q[0]
			q = q[1:]
			c, v := item[0], item[1]
			if covered[c][v] {
				continue
			}

			var chosen_arr int = -1
			for _, arr := range arrays_with[c][v] {
				if available[arr] {
					chosen_arr = arr
					break
				}
			}
			if chosen_arr == -1 {
				continue
			}

			chosen = append(chosen, chosen_arr)
			available[chosen_arr] = false

			for c1 := 1; c1 <= n; c1++ {
				v1 := A[chosen_arr][c1]
				if covered[c1][v1] {
					continue
				}
				covered[c1][v1] = true

				for _, B := range arrays_with[c1][v1] {
					if available[B] {
						available[B] = false
						for c2 := 1; c2 <= n; c2++ {
							v2 := A[B][c2]
							if !covered[c2][v2] {
								deg[c2][v2]--
								if deg[c2][v2] == 1 {
									q = append(q, [2]int{c2, v2})
								}
							}
						}
					}
				}
			}
		}

		ans := 1
		MOD := 998244353

		color := make([]int, 2*n+1)
		for j := 1; j <= 2*n; j++ {
			color[j] = -1
		}

		for i := 1; i <= 2*n; i++ {
			if available[i] && color[i] == -1 {
				ans = (ans * 2) % MOD
				q_arr := []int{i}
				color[i] = 0

				for len(q_arr) > 0 {
					curr := q_arr[0]
					q_arr = q_arr[1:]

					if color[curr] == 0 {
						chosen = append(chosen, curr)
					}

					for c := 1; c <= n; c++ {
						v := A[curr][c]
						if !covered[c][v] {
							for _, neighbor := range arrays_with[c][v] {
								if available[neighbor] && color[neighbor] == -1 {
									color[neighbor] = 1 - color[curr]
									q_arr = append(q_arr, neighbor)
								}
							}
						}
					}
				}
			}
		}

		fmt.Fprintln(out, ans)
		for i, idx := range chosen {
			if i > 0 {
				fmt.Fprint(out, " ")
			}
			fmt.Fprint(out, idx)
		}
		fmt.Fprintln(out)
	}
}