For problem statement at 2000-2999/2100-2199/2110-2119/2119/problemE.txt this is a correct solution, but verifier at 2000-2999/2100-2199/2110-2119/2119/verifierE.go ends with Accepted (120 tests). can you fix the verifier? package main
import (
"io"
"os"
"strconv"
)
const all29 uint32 = (1 << 29) - 1
const inf int64 = 1 << 60
func addState(out *[32]uint64, cnt *int, x uint64) {
for i := 0; i < *cnt; i++ {
if out[i]&x == out[i] {
return
}
}
out[*cnt] = x
*cnt++
}
func genStates(g uint32, d uint64, out *[32]uint64) int {
if d == 0 {
out[0] = 0
return 1
}
cnt := 0
gd := uint64(g)
if d&^gd == 0 {
addState(out, &cnt, d)
}
for p := 0; p < 29; p++ {
bit := uint64(1) << p
if d&bit != 0 || gd&bit == 0 {
continue
}
if ((d >> (p + 1)) & ^(gd >> (p + 1))) != 0 {
continue
}
prefix := d & ^((uint64(1)<<(p+1)) - 1)
addState(out, &cnt, prefix|bit)
}
addState(out, &cnt, uint64(1)<<29)
addState(out, &cnt, uint64(1)<<30)
return cnt
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int64 {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
var v int64
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
v = v*10 + int64(data[idx]-'0')
idx++
}
return v
}
t := int(nextInt())
out := make([]byte, 0, t*16)
for ; t > 0; t-- {
n := int(nextInt())
a := make([]uint32, n-1)
for i := 0; i < n-1; i++ {
a[i] = uint32(nextInt())
}
b := make([]int64, n)
for i := 0; i < n; i++ {
b[i] = nextInt()
}
r := make([]uint32, n)
r[0] = a[0]
for i := 1; i < n-1; i++ {
r[i] = a[i-1] | a[i]
}
r[n-1] = a[n-2]
ok := true
for i := 0; i < n-1; i++ {
if (r[i] & r[i+1]) != a[i] {
ok = false
break
}
}
if !ok {
out = append(out, "-1\n"...)
continue
}
base := int64(0)
for i := 0; i < n; i++ {
base += int64(r[i]) - b[i]
}
calcG := func(i int) uint32 {
var u uint32
if i >= 2 {
u |= a[i-2]
}
if i >= 1 {
u |= a[i-1]
}
if i < n-1 {
u |= a[i]
}
if i+1 < n-1 {
u |= a[i+1]
}
return all29 &^ u
}
var prevMasks, curMasks [32]uint64
var prevDP, curDP [32]int64
var d0 uint64
if b[0] > int64(r[0]) {
d0 = uint64(b[0] - int64(r[0]))
}
cntPrev := genStates(calcG(0), d0, &prevMasks)
for i := 0; i < cntPrev; i++ {
prevDP[i] = int64(prevMasks[i])
}
for i := 1; i < n; i++ {
var d uint64
if b[i] > int64(r[i]) {
d = uint64(b[i] - int64(r[i]))
}
cntCur := genStates(calcG(i), d, &curMasks)
for k := 0; k < cntCur; k++ {
mask := curMasks[k]
best := inf
for j := 0; j < cntPrev; j++ {
if prevMasks[j]&mask == 0 {
if prevDP[j] < best {
best = prevDP[j]
}
}
}
curDP[k] = best + int64(mask)
}
cntPrev = cntCur
prevMasks = curMasks
prevDP = curDP
}
minExtra := inf
for i := 0; i < cntPrev; i++ {
if prevDP[i] < minExtra {
minExtra = prevDP[i]
}
}
ans := base + minExtra
out = strconv.AppendInt(out, ans, 10)
out = append(out, '\n')
}
os.Stdout.Write(out)
}