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