For problem statement at 0-999/200-299/210-219/217/problemE.txt this is a correct solution, but verifier at 0-999/200-299/210-219/217/verifierE.go ends with case 1 failed: expected TTAAT got TAT
exit status 1 can you fix the verifier? package main
import (
"bufio"
"io"
"os"
)
const (
typOrig = 0
typConcat = 1
typView = 2
)
type Node struct {
typ uint8
len int64
a int64
b int64
l *Node
r *Node
}
type Fast struct {
data []byte
i int
n int
}
func (f *Fast) skip() {
for f.i < f.n && f.data[f.i] <= ' ' {
f.i++
}
}
func (f *Fast) nextBytes() []byte {
f.skip()
start := f.i
for f.i < f.n && f.data[f.i] > ' ' {
f.i++
}
return f.data[start:f.i]
}
func (f *Fast) nextInt64() int64 {
f.skip()
var v int64
for f.i < f.n && f.data[f.i] > ' ' {
v = v*10 + int64(f.data[f.i]-'0')
f.i++
}
return v
}
var pool []Node
var poolPtr int
func alloc() *Node {
n := &pool[poolPtr]
poolPtr++
return n
}
func makeOrig(start, step, cnt int64) *Node {
if cnt <= 0 {
return nil
}
if cnt == 1 {
step = 1
}
n := alloc()
n.typ = typOrig
n.len = cnt
n.a = start
n.b = step
n.l = nil
n.r = nil
return n
}
func locate(node *Node, pos int64) int64 {
for {
switch node.typ {
case typOrig:
return node.a + node.b*(pos-1)
case typView:
pos = node.a + node.b*(pos-1)
node = node.l
default:
if pos <= node.l.len {
node = node.l
} else {
pos -= node.l.len
node = node.r
}
}
}
}
func makeView(child *Node, offset, step, cnt int64) *Node {
if child == nil || cnt <= 0 {
return nil
}
if cnt == 1 {
return makeOrig(locate(child, offset), 1, 1)
}
for {
if offset == 1 && step == 1 && cnt == child.len {
return child
}
switch child.typ {
case typOrig:
return makeOrig(child.a+child.b*(offset-1), child.b*step, cnt)
case typView:
offset = child.a + child.b*(offset-1)
step = child.b * step
child = child.l
default:
lenL := child.l.len
last := offset + step*(cnt-1)
if last <= lenL {
child = child.l
} else if offset > lenL {
offset -= lenL
child = child.r
} else {
n := alloc()
n.typ = typView
n.len = cnt
n.a = offset
n.b = step
n.l = child
n.r = nil
return n
}
}
}
}
func makeConcat(a, b *Node) *Node {
if a == nil {
return b
}
if b == nil {
return a
}
if a.typ == typOrig && b.typ == typOrig && a.b == b.b && a.a+a.b*a.len == b.a {
return makeOrig(a.a, a.b, a.len+b.len)
}
if a.typ == typView && b.typ == typView && a.l == b.l && a.b == b.b && a.a+a.b*a.len == b.a {
return makeView(a.l, a.a, a.b, a.len+b.len)
}
n := alloc()
n.typ = typConcat
n.len = a.len + b.len
n.a = 0
n.b = 0
n.l = a
n.r = b
return n
}
func min64(a, b int64) int64 {
if a < b {
return a
}
return b
}
type Task struct {
node *Node
a int64
d int64
m int64
}
func materialize(root *Node, src []byte) []byte {
out := make([]byte, int(root.len))
idx := 0
stack := make([]Task, 0, 1024)
n := root
var a, d, m int64 = 1, 1, root.len
for {
for {
if n == nil || m <= 0 {
break
}
switch n.typ {
case typView:
a = n.a + n.b*(a-1)
if m == 1 {
d = 1
} else {
d = n.b * d
}
n = n.l
case typConcat:
lenL := n.l.len
if a > lenL {
a -= lenL
n = n.r
continue
}
t := (lenL-a)/d + 1
if t >= m {
n = n.l
continue
}
stack = append(stack, Task{node: n.r, a: a + d*t - lenL, d: d, m: m - t})
m = t
n = n.l
default:
start := n.a + n.b*(a-1)
if m == 1 {
out[idx] = src[int(start-1)]
idx++
} else {
step := n.b * d
if step == 1 {
s := int(start - 1)
e := s + int(m)
copy(out[idx:idx+int(m)], src[s:e])
idx += int(m)
} else {
pos := start - 1
for i := int64(0); i < m; i++ {
out[idx] = src[int(pos)]
idx++
pos += step
}
}
}
break
}
if n == nil || n.typ == typOrig {
break
}
}
if len(stack) == 0 {
break
}
t := stack[len(stack)-1]
stack = stack[:len(stack)-1]
n = t.node
a = t.a
d = t.d
m = t.m
}
return out
}
func main() {
data, _ := io.ReadAll(os.Stdin)
f := Fast{data: data, n: len(data)}
src := append([]byte(nil), f.nextBytes()...)
k := f.nextInt64()
nm := int(f.nextInt64())
pool = make([]Node, 30*nm+100)
curLen := int64(len(src))
root := makeOrig(1, 1, min64(curLen, k))
for i := 0; i < nm; i++ {
l := f.nextInt64()
r := f.nextInt64()
m := r - l + 1
curLen += m
newLen := min64(curLen, k)
if r >= newLen {
root = makeView(root, 1, 1, newLen)
continue
}
a := makeView(root, 1, 1, r)
b := makeView(root, l, 1, m)
copyLen := min64(m, newLen-r)
evenCnt := m / 2
var d *Node
if copyLen <= evenCnt {
d = makeView(b, 2, 2, copyLen)
} else {
d = makeConcat(makeView(b, 2, 2, evenCnt), makeView(b, 1, 2, copyLen-evenCnt))
}
tailLen := newLen - r - copyLen
e := makeView(root, r+1, 1, tailLen)
root = makeConcat(makeConcat(a, d), e)
}
out := materialize(root, src)
w := bufio.NewWriterSize(os.Stdout, 1<<22)
w.Write(out)
w.WriteByte('\n')
w.Flush()
}