← Home
For problem statement at 1000-1999/1500-1599/1510-1519/1510/problemB.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1510-1519/1510/verifierB.go ends with test 4 invalid: participant sequence shorter than reference (expected 7 got 5)
input:
4 4
1000
1011
0100
1001

exit status 1 can you fix the verifier? package main

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

type Password struct {
	mask int
	size int
}

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

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

	passwords := make([]Password, n)
	for i := 0; i < n; i++ {
		var s string
		fmt.Fscan(reader, &s)
		mask := 0
		size := 0
		for bit := 0; bit < d; bit++ {
			if s[bit] == '1' {
				mask |= (1 << bit)
				size++
			}
		}
		passwords[i] = Password{mask: mask, size: size}
	}

	sort.Slice(passwords, func(i, j int) bool {
		return passwords[i].size > passwords[j].size
	})

	adj := make([][]int, n)
	for i := 0; i < n; i++ {
		for j := 0; j < i; j++ {
			if (passwords[i].mask & passwords[j].mask) == passwords[i].mask {
				adj[i] = append(adj[i], j)
			}
		}
	}

	matched := make([]int, n)
	for i := 0; i < n; i++ {
		matched[i] = -1
	}
	visited := make([]bool, n)

	var dfs func(u int) bool
	dfs = func(u int) bool {
		for _, v := range adj[u] {
			if !visited[v] {
				visited[v] = true
				if matched[v] == -1 || dfs(matched[v]) {
					matched[v] = u
					return true
				}
			}
		}
		return false
	}

	for i := 0; i < n; i++ {
		for j := 0; j < n; j++ {
			visited[j] = false
		}
		dfs(i)
	}

	nxt := make([]int, n)
	for i := 0; i < n; i++ {
		nxt[i] = -1
	}
	hasIncoming := make([]bool, n)
	for v := 0; v < n; v++ {
		if matched[v] != -1 {
			nxt[matched[v]] = v
			hasIncoming[v] = true
		}
	}

	var sequence []int
	firstChain := true

	for i := 0; i < n; i++ {
		if !hasIncoming[i] {
			if !firstChain {
				sequence = append(sequence, -1)
			}
			firstChain = false

			currMask := 0
			curr := i
			for curr != -1 {
				targetMask := passwords[curr].mask
				diff := targetMask &^ currMask
				for bit := 0; bit < d; bit++ {
					if (diff & (1 << bit)) != 0 {
						sequence = append(sequence, bit)
					}
				}
				currMask = targetMask
				curr = nxt[curr]
			}
		}
	}

	fmt.Fprintln(writer, len(sequence))
	for i, token := range sequence {
		if i > 0 {
			fmt.Fprint(writer, " ")
		}
		if token == -1 {
			fmt.Fprint(writer, "R")
		} else {
			fmt.Fprint(writer, token)
		}
	}
	fmt.Fprintln(writer)
}