← Home
For problem statement at 1000-1999/1200-1299/1280-1289/1286/problemE.txt this is a correct solution, but verifier at 1000-1999/1200-1299/1280-1289/1286/verifierE.go ends with  can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n int
	if _, err := fmt.Fscanf(reader, "%d\n", &n); err != nil {
		return
	}

	S := make([]byte, 0, n)
	W := make([]int, 0, n)
	ans := int64(0)
	MASK := 1<<30 - 1

	pi := make([]int, n)
	st := make([][][2]int, n)

	for i := 0; i < n; i++ {
		var cStr string
		var w int
		fmt.Fscanf(reader, "%s %d\n", &cStr, &w)

		c := cStr[0]
		shift := int(ans % 26)
		c = byte((int(c-'a')+shift)%26 + 'a')
		w = w ^ (int(ans) & MASK)

		S = append(S, c)
		W = append(W, w)

		if i == 0 {
			pi[i] = 0
			st[i] = [][2]int{{w, 1}}
			ans += int64(w)
			fmt.Fprintln(writer, ans)
			continue
		}

		j := pi[i-1]
		for j > 0 && S[i] != S[j] {
			j = pi[j-1]
		}
		if S[i] == S[j] {
			j++
		}
		pi[i] = j

		newSt := [][2]int{}
		for _, pair := range st[i-1] {
			val := pair[0]
			idx := pair[1]
			if W[i] < val {
				val = W[i]
			}
			if S[i] == S[idx] {
				if len(newSt) > 0 && newSt[len(newSt)-1][0] == val {
				} else {
					newSt = append(newSt, [2]int{val, idx + 1})
				}
			}
		}

		if S[i] == S[0] {
			if len(newSt) > 0 && newSt[len(newSt)-1][0] == W[i] {
			} else {
				newSt = append(newSt, [2]int{W[i], 1})
			}
		}

		st[i] = newSt

		ans += int64(W[0])
		if len(st[i]) > 0 {
			prevIdx := i + 1
			for idx := 0; idx < len(st[i]); idx++ {
				currVal := st[i][idx][0]
				currLen := st[i][idx][1]
				ans += int64(currVal) * int64(prevIdx-currLen)
				prevIdx = currLen
			}
			ans += int64(W[0]) * int64(prevIdx-1)
		} else {
			ans += int64(W[0]) * int64(i)
		}

		fmt.Fprintln(writer, ans)
	}
}