func_code_string: #include <bits/stdc++.h>   using namespace std;   struct _IO {     _IO() {       ios::sync_with_stdio(0);       cin.tie(0);     }   } _io;   using ll = long long;   using db = long double;   using pi = pair<int, int>;   using mi = map<int, int>;   const int N = 6e5 + 5, M = 1e9 + 7;   using vi = vector<int>;   ll ri() {     ll x;     cin >> x;     return x;   }   void prl() { cout <<   n ; }   template <class T, class... U>   void prl(T x, U... y) {     cout << x <<    , prl(y...);   }   template <class T, class U>   ostream &operator<<(ostream &out, pair<T, U> p) {     out <<  (  << p.first <<  ,   << p.second <<  ) ;     return out;   }   template <class T>   ostream &operator<<(ostream &out, vector<T> &v) {     cout <<  { ;     for (int i = (0); i < (v.size()); ++i) {       if (i) cout <<  ,  ;       cout << v[i];     }     cout <<  } ;     return out;   }   struct cp {     db x, y;     cp(db a = 0, db b = 0) : x(a), y(b) {}     cp operator-(const cp &b) const { return cp(x - b.x, y - b.y); }     cp operator+(const cp &b) const { return cp(x + b.x, y + b.y); }     cp operator*(const cp &b) const {       return cp(x * b.x - y * b.y, x * b.y + y * b.x);     }     cp operator/(const int &b) const { return cp(x / b, y / b); }   };   const db PI = acos(-1);   int rev[N];   void init(int n) {     for (int i = 0, lim = __builtin_ctz(n); i < n; i++)       rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (lim - 1));   }   void fft(cp *a, int n, int f) {     for (int i = 0; i < n; i++)       if (i < rev[i]) swap(a[i], a[rev[i]]);     for (int l = 2, m = 1; l <= n; m = l, l <<= 1)       for (cp *p = a, wn(cos(2 * PI / l), sin(f * 2 * PI / l)); p != a + n;            p += l)         for (cp *q = p, w(1, 0); q != p + m; q++, w = w * wn) {           cp t = *(q + m) * w;           *(q + m) = *q - t;           *q = *q + t;         }     if (f == -1)       for (int i = 0; i < n; i++) a[i] = a[i] / n;   }   cp a[N];   signed main() {     int n = ri(), m = ri(), k = ri();     string s, t, p =  ATCG ;     cin >> s >> t;     int len = 1;     while (len < n + m) len *= 2;     init(len);     vi ans(len), sum(n + 1);     for (int c = (0); c < (4); ++c) {       memset(a, 0, sizeof a);       for (int i = (0); i < (n); ++i) {         if (s[i] == p[c]) {           sum[i + 1] = 1;         } else {           sum[i + 1] = 0;         }         sum[i + 1] = sum[i] + sum[i + 1];       }       for (int i = (0); i < (n); ++i) {         if (sum[min(n, i + k + 1)] - sum[max(0, i - k)] >= 1) {           a[i].x = 1;         }       }       for (int i = (0); i < (m); ++i) {         if (t[i] == p[c]) {           a[m - i - 1].y = 1;         }       }       fft(a, len, 1);       for (int i = (0); i < (len); ++i) {         a[i] = a[i] * a[i];       }       fft(a, len, -1);       for (int i = (0); i < (len); ++i) {         ans[i] += (int)(a[i].y / 2 + 0.5);       }     }     int cnt = 0;     for (int i = (0); i < (n); ++i)       if (ans[i] == m) ++cnt;     prl(cnt);   }   