#include <bits/stdc++.h>   const int maxn = 1e5 + 10;   const int N = 5e2 + 10;   using namespace std;   long long gcd(long long p, long long q) { return q == 0 ? p : gcd(q, p % q); }   long long qpow(long long p, long long q) {     long long f = 1;     while (q) {       if (q & 1) f = f * p % 1000000007;       p = p * p % 1000000007;       q >>= 1;     }     return f;   }   int n, m, k, t;   vector<int> d[4][11][10];   char a[maxn], b[maxn];   int gao(char p) {     if (p ==  A )       return 0;     else if (p ==  T )       return 1;     else if (p ==  G )       return 2;     else       return 3;   }   void add(vector<int>& d, int x, int y) {     while (x < d.size()) d[x] += y, x += x & (-x);   }   int get(vector<int>& d, int x) {     int ret = 0;     while (x) ret += d[x], x -= x & (-x);     return ret;   }   int main() {     int i, j;     scanf( %s , a + 1);     n = strlen(a + 1);     for (i = 0; i <= (int)3; i++)       for (j = 1; j <= (int)10; j++)         for (k = 0; k <= (int)j - 1; k++) d[i][j][k].resize((n + j - 1) / j + 1);     for (i = 1; i <= n; i++) {       for (j = 1; j <= 10; j++) {         add(d[gao(a[i])][j][(i - 1) % j], (i - 1) / j + 1, 1);       }     }     int q;     scanf( %d , &q);     while (q--) {       int op, x, y;       scanf( %d%d , &op, &x);       if (op == 1) {         scanf( %s , b);         for (i = 1; i <= (int)10; i++)           add(d[gao(a[x])][i][(x - 1) % i], (x - 1) / i + 1, -1);         for (i = 1; i <= (int)10; i++)           add(d[gao(b[0])][i][(x - 1) % i], (x - 1) / i + 1, 1);         a[x] = b[0];       } else {         scanf( %d%s , &y, b);         int len = strlen(b), ret = 0;         for (i = 0; i < len && i < y - x + 1; i++) {           int mo = (i + x - 1) % len;           ret += get(d[gao(b[i])][len][mo], (y - 1 - mo) / len + 1) -                  get(d[gao(b[i])][len][mo], (x - 1 + len - 1 - mo) / len);         }         printf( %d n , ret);       }     }     return 0;   }   