← Home
For problem statement at 1000-1999/1200-1299/1270-1279/1279/problemF.txt this is a correct solution, but verifier at 1000-1999/1200-1299/1270-1279/1279/verifierF.go ends with case 29 failed
input:
9 6 5
FrQqkTqcr
expected: 1
 got: 0

exit status 1 can you fix the verifier? ```go
package main

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

type pair struct {
	idx int
	w   int
	c   int
}

func main() {
	input, _ := io.ReadAll(os.Stdin)
	if len(input) == 0 {
		return
	}

	var n, k, l int
	var pos int

	readInt := func() int {
		for pos < len(input) && (input[pos] < '0' || input[pos] > '9') {
			pos++
		}
		if pos >= len(input) {
			return 0
		}
		res := 0
		for pos < len(input) && input[pos] >= '0' && input[pos] <= '9' {
			res = res*10 + int(input[pos]-'0')
			pos++
		}
		return res
	}

	n = readInt()
	k = readInt()
	l = readInt()

	for pos < len(input) && input[pos] <= ' ' {
		pos++
	}
	start := pos
	for pos < len(input) && input[pos] > ' ' {
		pos++
	}
	s := input[start:pos]

	if int64(k)*int64(l) >= int64(n) {
		fmt.Println(0)
		return
	}

	ones := make([]int, n+1)
	dp := make([]int, n+1)
	cnt := make([]int, n+1)
	q := make([]pair, n+1)

	solve := func(targetLower bool) int {
		for i := 0; i < n; i++ {
			ones[i+1] = ones[i]
			isLower := s[i] >= 'a' && s[i] <= 'z'
			if isLower == targetLower {
				ones[i+1]++
			}
		}

		low, high := 0, l+1
		bestCov := 0

		for low <= high {
			mid := (low + high) / 2

			head, tail := 0, 0
			q[tail] = pair{0, 0, 0}
			tail++

			for i := 1; i <= n; i++ {
				for head < tail && q[head].idx < i-l {
					head++
				}

				dp[i] = dp[i-1]
				cnt[i] = cnt[i-1]

				if head < tail {
					best := q[head]
					val := best.w + ones[i] - mid
					c := best.c + 1
					if val > dp[i] || (val == dp[i] && c < cnt[i]) {
						dp[i] = val
						cnt[i] = c
					}
				}

				w := dp[i] - ones[i]
				c := cnt[i]
				for head < tail {
					last := q[tail-1]
					if last.w < w || (last.w == w && last.c >= c) {
						tail--
					} else {
						break
					}
				}
				q[tail] = pair{i, w, c}
				tail++
			}

			if cnt[n] <= k {
				bestCov = dp[n] + mid*k
				high = mid - 1
			} else {
				low = mid + 1
			}
		}

		return ones[n] - bestCov
	}

	ans1 := solve(true)
	ans2 := solve(false)

	if ans1 < ans2 {
		fmt.Println(ans1)
	} else {
		fmt.Println(ans2)
	}
}
```