← Home
For problem statement at 0-999/200-299/290-299/291/problemE.txt this is a correct solution, but verifier at 0-999/200-299/290-299/291/verifierE.go ends with All tests passed can you fix the verifier? package main

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

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

func (fs *FastScanner) skip() {
	for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
}

func (fs *FastScanner) NextInt() int {
	fs.skip()
	val := 0
	for fs.idx < fs.n {
		b := fs.data[fs.idx]
		if b < '0' || b > '9' {
			break
		}
		val = val*10 + int(b-'0')
		fs.idx++
	}
	return val
}

func (fs *FastScanner) NextString() string {
	fs.skip()
	start := fs.idx
	for fs.idx < fs.n && fs.data[fs.idx] > ' ' {
		fs.idx++
	}
	return string(fs.data[start:fs.idx])
}

type Edge struct {
	to int
	s  string
}

func main() {
	fs := NewFastScanner()
	n := fs.NextInt()

	children := make([][]Edge, n+1)
	for v := 2; v <= n; v++ {
		p := fs.NextInt()
		s := fs.NextString()
		children[p] = append(children[p], Edge{to: v, s: s})
	}

	t := fs.NextString()
	m := len(t)

	pi := make([]int, m)
	for i := 1; i < m; i++ {
		j := pi[i-1]
		for j > 0 && t[i] != t[j] {
			j = pi[j-1]
		}
		if t[i] == t[j] {
			j++
		}
		pi[i] = j
	}

	aut := make([]int32, (m+1)*26)
	for i := 0; i <= m; i++ {
		base := i * 26
		for c := 0; c < 26; c++ {
			if i < m && int(t[i]-'a') == c {
				aut[base+c] = int32(i + 1)
			} else if i == 0 {
				aut[base+c] = 0
			} else {
				aut[base+c] = aut[pi[i-1]*26+c]
			}
		}
	}

	state := make([]int, n+1)
	stack := make([]int, 1, n)
	stack[0] = 1

	var ans int64

	for len(stack) > 0 {
		v := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		st := state[v]

		for _, e := range children[v] {
			j := st
			s := e.s
			for i := 0; i < len(s); i++ {
				j = int(aut[j*26+int(s[i]-'a')])
				if j == m {
					ans++
				}
			}
			state[e.to] = j
			stack = append(stack, e.to)
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprintln(out, ans)
	out.Flush()
}