#include <bits/stdc++.h>
const int MAXN = 2e5 + 10;
char s[MAXN], t[MAXN];
int n, m, k;
namespace bit {
int a[MAXN << 1];
int n;
void init(int _n) {
  n = _n;
  std::fill(a + 1, a + n + 1, 0);
}
void add(int x, int y) {
  for (; x <= n; x += x & (-x)) a[x] += y;
}
int query(int x) {
  int ans = 0;
  for (; x > 0; x -= x & (-x)) {
    ans += a[x];
  }
  return ans;
}
}  // namespace bit
int res[MAXN << 1];
namespace fft {
const int MOD = 998244353;
const int g = 3;
namespace {
inline int add(int x) { return x >= MOD ? x - MOD : x; }
inline int sub(int x) { return x < 0 ? x + MOD : x; }
inline int mul(int x, int y) { return 1ll * x * y % MOD; }
inline int pwr(int x, int y) {
  int ans = 1;
  for (; y; y >>= 1, x = mul(x, x)) {
    if (y & 1) ans = mul(ans, x);
  }
  return ans;
}
}  // namespace
const int MAXN = ::MAXN << 2;
int a[MAXN], b[MAXN];
int rev[MAXN];
void init(int n) {
  for (int i = 0; i < n; i++) {
    rev[i] = rev[i >> 1] >> 1 | (i & 1 ? n >> 1 : 0);
  }
}
void dft(int *a, int n, int lg, bool idft = 0) {
  for (int i = 0; i < n; i++) {
    if (i < rev[i]) {
      std::swap(a[i], a[rev[i]]);
    }
  }
  for (int i = 1; i <= lg; i++) {
    int m = (1 << i);
    int omega = pwr(g, (MOD - 1) >> i);
    if (idft) {
      omega = pwr(omega, MOD - 2);
    }
    for (int j = 0; j < n; j += m) {
      int *l = a + j, *r = l + (m >> 1), w = 1;
      for (int k = 0; k < (m >> 1); l++, r++, k++, w = mul(w, omega)) {
        int t = mul(*r, w);
        *r = sub(*l - t);
        *l = add(*l + t);
      }
    }
  }
  if (idft) {
    int inv = pwr(n, MOD - 2);
    for (int i = 0; i < n; i++) {
      a[i] = mul(a[i], inv);
    }
  }
}
std::vector<int> main(std::vector<int> x, std::vector<int> y) {
  int sz = x.size() + y.size() - 1;
  int lg = 0;
  for (; (1 << lg) < sz; lg++)
    ;
  int n = 1 << lg;
  std::copy(x.begin(), x.end(), a);
  std::copy(y.begin(), y.end(), b);
  std::fill(a + x.size(), a + n, 0);
  std::fill(b + y.size(), b + n, 0);
  init(n);
  dft(a, n, lg);
  dft(b, n, lg);
  for (int i = 0; i < n; i++) {
    a[i] = mul(a[i], b[i]);
  }
  dft(a, n, lg, 1);
  return {a, a + sz};
}
}  // namespace fft
int main() {
  scanf("%d%d%d", &n, &m, &k);
  scanf("%s", s + 1);
  scanf("%s", t + 1);
  std::reverse(t + 1, t + m + 1);
  for (char c : {'A', 'T', 'G', 'C'}) {
    static int val[MAXN], p[MAXN];
    memset(val, 0, sizeof val);
    memset(p, 0, sizeof p);
    bit::init(n + k);
    for (int i = 1; i <= n; i++) {
      if (s[i] == c) bit::add(i, 1);
    }
    for (int i = 1; i <= n; i++) {
      val[i] = bool(bit::query(i + k) - bit::query(i - k - 1));
    }
    for (int i = 1; i <= m; i++) {
      p[i] = (t[i] == c);
    }
    std::vector<int> a(val + 1, val + n + 1), b(p + 1, p + m + 1);
    auto v = fft::main(a, b);
    for (int i = 0; i < (int)v.size(); i++) {
      res[i] += v[i];
    }
  }
  int ans = 0;
  for (int i = 0; i < n; i++) {
    ans += res[i] == m;
  }
  printf("%d\n", ans);
}
