← Home
For problem statement at 1000-1999/1800-1899/1880-1889/1889/problemD.txt this is a correct solution, but verifier at 1000-1999/1800-1899/1880-1889/1889/verifierD.go ends with All 100 tests passed can you fix the verifier? package main

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

func readInt(reader *bufio.Reader) int {
	var n int
	var c byte
	var err error
	for {
		c, err = reader.ReadByte()
		if err != nil {
			return 0
		}
		if c >= '0' && c <= '9' {
			break
		}
	}
	n = int(c - '0')
	for {
		c, err = reader.ReadByte()
		if err != nil || c < '0' || c > '9' {
			break
		}
		n = n*10 + int(c-'0')
	}
	return n
}

func main() {
	reader := bufio.NewReaderSize(os.Stdin, 65536)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	n := readInt(reader)
	if n == 0 {
		return
	}

	stacks := make([][]int, n+1)
	for i := 1; i <= n; i++ {
		k := readInt(reader)
		stacks[i] = make([]int, k)
		for j := 0; j < k; j++ {
			stacks[i][j] = readInt(reader)
		}
	}

	state := make([]int, n+1)
	P := make([]int, 0, n+1)

	for i := 1; i <= n; i++ {
		for state[i] == 0 {
			P = P[:0]
			P = append(P, i)
			state[i] = 1

			for len(P) > 0 {
				u := P[len(P)-1]
				if len(stacks[u]) == 0 {
					state[u] = 2
					P = P[:len(P)-1]
					continue
				}

				v := stacks[u][len(stacks[u])-1]

				if state[v] == 0 {
					state[v] = 1
					P = append(P, v)
				} else if state[v] == 1 {
					idx := len(P) - 1
					for P[idx] != v {
						idx--
					}

					for j := idx; j < len(P); j++ {
						x := P[j]
						state[x] = 0
						stacks[x] = stacks[x][:len(stacks[x])-1]
					}
					P = P[:idx]
				} else if state[v] == 2 {
					state[u] = 2
					P = P[:len(P)-1]
				}
			}
		}
	}

	ans := make([]int, n+1)
	path := make([]int, 0, n+1)

	for i := 1; i <= n; i++ {
		if ans[i] != 0 {
			continue
		}
		path = path[:0]
		curr := i
		for ans[curr] == 0 {
			if len(stacks[curr]) == 0 {
				ans[curr] = curr
				break
			}
			path = append(path, curr)
			curr = stacks[curr][len(stacks[curr])-1]
		}
		res := ans[curr]
		for _, u := range path {
			ans[u] = res
		}
	}

	for i := 1; i <= n; i++ {
		fmt.Fprint(writer, ans[i])
		if i < n {
			fmt.Fprint(writer, " ")
		}
	}
	fmt.Fprintln(writer)
}