#include <bits/stdc++.h>
using namespace std;
string s;
int n, m;
int parA[101010], imparA[101010], parB[101010], imparB[101010], inter[101010];
char lst;
pair<int, int> dp[101010];
pair<int, int> acc[101010];
void build() {
  for (int i = 0; i < (int)s.size(); i++) {
    if (s[i] == 'a') {
      if (i % 2 == 0) {
        parA[i] = 1;
      } else {
        imparA[i] = 1;
      }
    } else if (s[i] == 'b') {
      if (i % 2 == 0) {
        parB[i] = 1;
      } else {
        imparB[i] = 1;
      }
    } else {
      inter[i] = 1;
    }
    parA[i] += (i ? parA[i - 1] : 0);
    imparA[i] += (i ? imparA[i - 1] : 0);
    parB[i] += (i ? parB[i - 1] : 0);
    imparB[i] += (i ? imparB[i - 1] : 0);
    inter[i] += (i ? inter[i - 1] : 0);
  }
}
int getAPar(int l, int r) { return parA[r] - (l ? parA[l - 1] : 0); }
int getAImpar(int l, int r) { return imparA[r] - (l ? imparA[l - 1] : 0); }
int getBPar(int l, int r) { return parB[r] - (l ? parB[l - 1] : 0); }
int getBImpar(int l, int r) { return imparB[r] - (l ? imparB[l - 1] : 0); }
int getInter(int l, int r) { return inter[r] - (l ? inter[l - 1] : 0); }
bool can(int pos) {
  int aFora, bFora;
  if (pos % 2 == 0) {
    if (lst == 'a') {
      aFora = getAImpar(pos - m + 1, pos);
      if (aFora > 0) return false;
      bFora = getBPar(pos - m + 1, pos);
      if (bFora > 0) return false;
    } else {
      aFora = getAPar(pos - m + 1, pos);
      if (aFora > 0) return false;
      bFora = getBImpar(pos - m + 1, pos);
      if (bFora > 0) return false;
    }
  } else {
    if (lst == 'a') {
      aFora = getAPar(pos - m + 1, pos);
      if (aFora > 0) return false;
      bFora = getBImpar(pos - m + 1, pos);
      if (bFora > 0) return false;
    } else {
      aFora = getAImpar(pos - m + 1, pos);
      if (aFora > 0) return false;
      bFora = getBPar(pos - m + 1, pos);
      if (bFora > 0) return false;
    }
  }
  return true;
}
int getCost(int pos) { return getInter(pos - m + 1, pos); }
pair<int, int> _max(pair<int, int> a, pair<int, int> b) {
  if (a.first == b.first) return make_pair(a.first, min(a.second, b.second));
  if (a.first < b.first) return b;
  return a;
}
int main() {
  cin >> n;
  cin >> s;
  cin >> m;
  if (m % 2)
    lst = 'a';
  else
    lst = 'b';
  build();
  for (int i = 0; i < m - 1; i++) {
    dp[i] = make_pair(0, 0);
  }
  for (int i = m - 1; i < n; i++) {
    if (can(i)) {
      dp[i] = make_pair(dp[i - m].first + 1, dp[i - m].second + getCost(i));
    } else {
      dp[i] = make_pair(0, 0);
    }
    dp[i] = _max(dp[i - 1], dp[i]);
  }
  cout << dp[n - 1].second << "\n";
  return 0;
}
