← Home
For problem statement at 2000-2999/2000-2099/2030-2039/2038/problemI.txt this is a correct solution, but verifier at 2000-2999/2000-2099/2030-2039/2038/verifierI.go ends with mismatch at token 1: expected "15" got "123"
exit status 1 can you fix the verifier? package main

import (
	"io"
	"os"
	"strconv"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	readInt := func() int {
		for idx < len(data) && data[idx] <= ' ' {
			idx++
		}
		x := 0
		for idx < len(data) && data[idx] > ' ' {
			x = x*10 + int(data[idx]-'0')
			idx++
		}
		return x
	}

	n := readInt()
	m := readInt()

	bits := make([]byte, n*m)
	for i := 0; i < n; i++ {
		for idx < len(data) && data[idx] != '0' && data[idx] != '1' {
			idx++
		}
		base := i * m
		for j := 0; j < m; j++ {
			bits[base+j] = data[idx] - '0'
			idx++
		}
	}

	suff := make([]uint32, (m+1)*n)
	ordA := make([]int, n)
	ordB := make([]int, n)
	for i := 0; i < n; i++ {
		ordA[i] = i
	}

	for p := m - 1; p >= 0; p-- {
		count0 := 0
		for i := 0; i < n; i++ {
			row := ordA[i]
			if bits[row*m+p] == 0 {
				count0++
			}
		}
		z, o := 0, count0
		for i := 0; i < n; i++ {
			row := ordA[i]
			if bits[row*m+p] == 0 {
				ordB[z] = row
				z++
			} else {
				ordB[o] = row
				o++
			}
		}
		baseCur := p * n
		baseNext := (p + 1) * n
		prevRow := ordB[0]
		prevBit := bits[prevRow*m+p]
		prevNext := suff[baseNext+prevRow]
		var rank uint32
		suff[baseCur+prevRow] = 0
		for i := 1; i < n; i++ {
			row := ordB[i]
			b := bits[row*m+p]
			nx := suff[baseNext+row]
			if b != prevBit || nx != prevNext {
				rank++
				prevBit = b
				prevNext = nx
			}
			suff[baseCur+row] = rank
		}
		ordA, ordB = ordB, ordA
	}

	prePrev := make([]uint32, n)
	preCur := make([]uint32, n)
	for i := 0; i < n; i++ {
		ordA[i] = i
	}

	out := make([]byte, 0, m*8)

	bestRow := 0
	bestS := suff[0]
	for i := 1; i < n; i++ {
		if suff[i] > bestS {
			bestS = suff[i]
			bestRow = i
		}
	}
	out = strconv.AppendInt(out, int64(bestRow+1), 10)

	for p := 1; p < m; p++ {
		bpos := p - 1
		cur := 0
		for l := 0; l < n; {
			rv := prePrev[ordA[l]]
			r := l + 1
			for r < n && prePrev[ordA[r]] == rv {
				r++
			}
			for i := l; i < r; i++ {
				row := ordA[i]
				if bits[row*m+bpos] == 0 {
					ordB[cur] = row
					cur++
				}
			}
			for i := l; i < r; i++ {
				row := ordA[i]
				if bits[row*m+bpos] != 0 {
					ordB[cur] = row
					cur++
				}
			}
			l = r
		}

		prevRow := ordB[0]
		prevRank := prePrev[prevRow]
		prevBit := bits[prevRow*m+bpos]
		var rank uint32
		preCur[prevRow] = 0
		for i := 1; i < n; i++ {
			row := ordB[i]
			rv := prePrev[row]
			b := bits[row*m+bpos]
			if rv != prevRank || b != prevBit {
				rank++
				prevRank = rv
				prevBit = b
			}
			preCur[row] = rank
		}

		baseS := p * n
		bestRow = 0
		bestS = suff[baseS]
		bestP := preCur[0]
		for i := 1; i < n; i++ {
			sr := suff[baseS+i]
			pr := preCur[i]
			if sr > bestS || (sr == bestS && pr > bestP) {
				bestS = sr
				bestP = pr
				bestRow = i
			}
		}

		out = append(out, ' ')
		out = strconv.AppendInt(out, int64(bestRow+1), 10)

		prePrev, preCur = preCur, prePrev
		ordA, ordB = ordB, ordA
	}

	out = append(out, '\n')
	os.Stdout.Write(out)
}