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