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)
}