#include <bits/stdc++.h>
using namespace std;
template <typename _T>
inline void read(_T &f) {
  f = 0;
  _T fu = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') {
      fu = -1;
    }
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    f = (f << 3) + (f << 1) + (c & 15);
    c = getchar();
  }
  f *= fu;
}
template <typename T>
void print(T x) {
  if (x < 0) putchar('-'), x = -x;
  if (x < 10)
    putchar(x + 48);
  else
    print(x / 10), putchar(x % 10 + 48);
}
template <typename T>
void print(T x, char t) {
  print(x);
  putchar(t);
}
const int N = 1e6 + 5;
struct ele {
  int f, g;
  ele(int a = 0, int b = 0) : f(a), g(b) {}
  bool operator<(const ele A) const {
    if (f != A.f) return f < A.f;
    return g > A.g;
  }
};
ele operator+(const ele a, const ele b) { return ele(a.f + b.f, a.g + b.g); }
ele f[N];
char c[N];
int s[N];
int n, k, l;
ele dp(int mid) {
  for (int i = 0; i < l; i++) f[i] = ele(0, 0);
  for (int i = l; i <= n; i++)
    f[i] = max(f[i - 1], f[i - l] + ele(s[i] - s[i - l] - mid, 1));
  return f[n];
}
int solve(int opt) {
  for (int i = 1; i <= n; i++)
    s[i] = s[i - 1] + ((c[i] >= 'a' && c[i] <= 'z') == opt);
  int l = 0, r = n - 1, ans = n;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (dp(mid).g <= k)
      ans = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  return s[n] - (dp(ans).f + ans * k);
}
int main() {
  read(n);
  read(k);
  read(l);
  scanf("%s", c + 1);
  if (1ll * k * l > n) {
    print(0, '\n');
    return 0;
  }
  print(min(solve(0), solve(1)), '\n');
  return 0;
}
