For problem statement at 0-999/600-699/610-619/616/problemF.txt this is a correct solution, but verifier at 0-999/600-699/610-619/616/verifierF.go ends with case 1 failed: expected -6 got 0
input:
2
bcbcb
ccbcaa
-8 -6
exit status 1 can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
const MAXS = 1000010
var (
nxt [MAXS][26]int32
lnk [MAXS]int32
ln [MAXS]int32
wt [MAXS]int64
sz int32 = 1
)
func extend(last int32, c byte) int32 {
charIdx := c - 'a'
if nxt[last][charIdx] != 0 {
q := nxt[last][charIdx]
if ln[q] == ln[last]+1 {
return q
}
sz++
clone := sz
ln[clone] = ln[last] + 1
nxt[clone] = nxt[q]
lnk[clone] = lnk[q]
for p := last; p != 0 && nxt[p][charIdx] == q; p = lnk[p] {
nxt[p][charIdx] = clone
}
lnk[q] = clone
return clone
}
sz++
cur := sz
ln[cur] = ln[last] + 1
p := last
for p != 0 && nxt[p][charIdx] == 0 {
nxt[p][charIdx] = cur
p = lnk[p]
}
if p == 0 {
lnk[cur] = 1
} else {
q := nxt[p][charIdx]
if ln[q] == ln[p]+1 {
lnk[cur] = q
} else {
sz++
clone := sz
ln[clone] = ln[p] + 1
nxt[clone] = nxt[q]
lnk[clone] = lnk[q]
for ; p != 0 && nxt[p][charIdx] == q; p = lnk[p] {
nxt[p][charIdx] = clone
}
lnk[q] = clone
lnk[cur] = clone
}
}
return cur
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
buf := make([]byte, 1024*1024*4)
scanner.Buffer(buf, 1024*1024*4)
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
strs := make([]string, n)
for i := 0; i < n; i++ {
scanner.Scan()
strs[i] = scanner.Text()
}
costs := make([]int64, n)
for i := 0; i < n; i++ {
scanner.Scan()
c, _ := strconv.ParseInt(scanner.Text(), 10, 64)
costs[i] = c
}
for i := 0; i < n; i++ {
var last int32 = 1
for j := 0; j < len(strs[i]); j++ {
last = extend(last, strs[i][j])
wt[last] += costs[i]
}
}
maxLen := int32(0)
for i := int32(1); i <= sz; i++ {
if ln[i] > maxLen {
maxLen = ln[i]
}
}
c := make([]int32, maxLen+1)
for i := int32(1); i <= sz; i++ {
c[ln[i]]++
}
for i := int32(1); i <= maxLen; i++ {
c[i] += c[i-1]
}
order := make([]int32, sz+1)
for i := sz; i >= 1; i-- {
order[c[ln[i]]] = i
c[ln[i]]--
}
ans := int64(0)
for i := sz; i >= 2; i-- {
u := order[i]
if val := wt[u] * int64(ln[u]); val > ans {
ans = val
}
lnkU := lnk[u]
if lnkU != 0 {
wt[lnkU] += wt[u]
}
}
fmt.Println(ans)
}