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