For problem statement at 0-999/100-199/100-109/101/problemE.txt this is a correct solution, but verifier at 0-999/100-199/100-109/101/verifierE.go ends with test 27 failed: expected "768\nCSSSSSSSCCC" got "669\nCSSSSCCCSSS"
exit status 1 can you fix the verifier? package main
import (
"bufio"
"io"
"os"
)
func writeInt(w *bufio.Writer, x int) {
if x == 0 {
w.WriteByte('0')
return
}
var buf [20]byte
i := len(buf)
for x > 0 {
i--
buf[i] = byte('0' + x%10)
x /= 10
}
w.Write(buf[i:])
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
v := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
v = v*10 + int(data[idx]-'0')
idx++
}
return v
}
n := nextInt()
m := nextInt()
p := nextInt()
x := make([]int, n)
maxX := 0
for i := 0; i < n; i++ {
v := nextInt() % p
x[i] = v
if v > maxX {
maxX = v
}
}
y := make([]int, m)
minY := 0
maxY := 0
for j := 0; j < m; j++ {
v := nextInt() % p
y[j] = v
if j == 0 || v < minY {
minY = v
}
if v > maxY {
maxY = v
}
}
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
if n == 1 || m == 1 {
path := make([]byte, n+m-2)
a, b := 0, 0
score := x[0] + y[0]
if score >= p {
score -= p
}
if n == 1 {
for t := 0; t < m-1; t++ {
b++
path[t] = 'S'
w := x[0] + y[b]
if w >= p {
w -= p
}
score += w
}
} else {
for t := 0; t < n-1; t++ {
a++
path[t] = 'C'
w := x[a] + y[0]
if w >= p {
w -= p
}
score += w
}
}
writeInt(out, score)
out.WriteByte('\n')
out.Write(path)
out.WriteByte('\n')
return
}
if maxX+maxY < p {
path := make([]byte, n+m-2)
a, b := 0, 0
score := x[0] + y[0]
for t := 0; t < len(path); t++ {
if a == n-1 {
b++
path[t] = 'S'
} else if b == m-1 {
a++
path[t] = 'C'
} else if x[a+1]-x[a] >= y[b+1]-y[b] {
a++
path[t] = 'C'
} else {
b++
path[t] = 'S'
}
score += x[a] + y[b]
}
writeInt(out, score)
out.WriteByte('\n')
out.Write(path)
out.WriteByte('\n')
return
}
cells := n * m
dirs := make([]uint64, (cells+63)>>6)
prev := make([]int, m)
cur := make([]int, m)
x0 := x[0]
t0 := p - x0
if t0 > maxY {
sum := x0 + y[0]
prev[0] = sum
for j := 1; j < m; j++ {
sum += x0 + y[j]
prev[j] = sum
}
} else if t0 <= minY {
sum := x0 + y[0] - p
prev[0] = sum
for j := 1; j < m; j++ {
sum += x0 + y[j] - p
prev[j] = sum
}
} else {
s := x0 + y[0]
if s >= p {
s -= p
}
prev[0] = s
sum := s
for j := 1; j < m; j++ {
w := x0 + y[j]
if w >= p {
w -= p
}
sum += w
prev[j] = sum
}
}
for i := 1; i < n; i++ {
xi := x[i]
ti := p - xi
base := i * m
wi := (base + 1) >> 6
bit := uint64(1) << (uint(base+1) & 63)
if ti > maxY {
v := prev[0] + xi + y[0]
cur[0] = v
left := v
for j := 1; j < m; j++ {
w := xi + y[j]
up := prev[j]
if up >= left {
left = up + w
dirs[wi] |= bit
} else {
left += w
}
cur[j] = left
bit <<= 1
if bit == 0 {
bit = 1
wi++
}
}
} else if ti <= minY {
v := prev[0] + xi + y[0] - p
cur[0] = v
left := v
for j := 1; j < m; j++ {
w := xi + y[j] - p
up := prev[j]
if up >= left {
left = up + w
dirs[wi] |= bit
} else {
left += w
}
cur[j] = left
bit <<= 1
if bit == 0 {
bit = 1
wi++
}
}
} else {
w0 := xi + y[0]
if w0 >= p {
w0 -= p
}
v := prev[0] + w0
cur[0] = v
left := v
for j := 1; j < m; j++ {
w := xi + y[j]
if w >= p {
w -= p
}
up := prev[j]
if up >= left {
left = up + w
dirs[wi] |= bit
} else {
left += w
}
cur[j] = left
bit <<= 1
if bit == 0 {
bit = 1
wi++
}
}
}
prev, cur = cur, prev
}
score := prev[m-1]
path := make([]byte, n+m-2)
i, j := n-1, m-1
for k := len(path) - 1; k >= 0; k-- {
if i == 0 {
path[k] = 'S'
j--
} else if j == 0 {
path[k] = 'C'
i--
} else {
id := i*m + j
if ((dirs[id>>6] >> (uint(id) & 63)) & 1) != 0 {
path[k] = 'C'
i--
} else {
path[k] = 'S'
j--
}
}
}
writeInt(out, score)
out.WriteByte('\n')
out.Write(path)
out.WriteByte('\n')
}