← Home
For problem statement at 0-999/400-499/470-479/476/problemE.txt this is a correct solution, but verifier at 0-999/400-499/470-479/476/verifierE.go ends with case 1 failed: expected [2 2 2 2 2 2] got [2 2 1 1 0 0]
exit status 1 can you fix the verifier? package main

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

func main() {
	in := bufio.NewReader(os.Stdin)
	var s, p string
	fmt.Fscan(in, &s, &p)

	sb := []byte(s)
	pb := []byte(p)
	n, m := len(sb), len(pb)
	K := 0
	if m <= n {
		K = n / m
	}

	nextPos := make([][26]int, n+2)
	for i := n; i >= 1; i-- {
		nextPos[i] = nextPos[i+1]
		nextPos[i][int(sb[i-1]-'a')] = i
	}

	end := make([]int, n+2)
	cost := make([]int, n+2)
	for i := 1; i <= n; i++ {
		if sb[i-1] != pb[0] {
			continue
		}
		e := i
		pos := i + 1
		ok := true
		for t := 1; t < m; t++ {
			j := 0
			if pos <= n+1 {
				j = nextPos[pos][int(pb[t]-'a')]
			}
			if j == 0 {
				ok = false
				break
			}
			e = j
			pos = j + 1
		}
		if ok {
			end[i] = e
			cost[i] = e - i + 1 - m
		}
	}

	const INF = int(1e9)
	dp := make([][]int, n+3)
	for i := 0; i < n+3; i++ {
		dp[i] = make([]int, K+1)
		for k := 1; k <= K; k++ {
			dp[i][k] = INF
		}
	}

	for i := n; i >= 1; i-- {
		dp[i][0] = 0
		for k := 1; k <= K; k++ {
			best := dp[i+1][k]
			if end[i] != 0 {
				cand := dp[end[i]+1][k-1]
				if cand != INF {
					cand += cost[i]
					if cand < best {
						best = cand
					}
				}
			}
			dp[i][k] = best
		}
	}

	ans := make([]int, n+1)
	for k := 1; k <= K; k++ {
		c := dp[1][k]
		if c >= INF {
			continue
		}
		lo := c
		hi := n - k*m
		if lo > hi {
			continue
		}
		for x := lo; x <= hi; x++ {
			if k > ans[x] {
				ans[x] = k
			}
		}
	}

	out := bufio.NewWriter(os.Stdout)
	for i := 0; i <= n; i++ {
		if i > 0 {
			fmt.Fprint(out, " ")
		}
		fmt.Fprint(out, ans[i])
	}
	fmt.Fprintln(out)
	out.Flush()
}