#include <bits/stdc++.h>
using namespace std;
int n;
int c[11][11][5][100005];
int lowbit(int x) { return x & (-x); }
void add(int a, int b, int cc, int i, int k) {
  while (i <= n) {
    c[a][b][cc][i] += k;
    i += lowbit(i);
  }
}
int query(int a, int b, int cc, int i) {
  int res = 0;
  while (i > 0) {
    res += c[a][b][cc][i];
    i -= lowbit(i);
  }
  return res;
}
int main(int argc, char** argv) {
  string ss;
  cin >> ss;
  n = ss.length();
  map<char, int> m;
  m['A'] = 0;
  m['T'] = 1;
  m['G'] = 2;
  m['C'] = 3;
  for (int i = 1; i <= 10; i++) {
    for (int j = 0; j <= ss.length() - 1; j++) {
      add(i, j % i, m[ss[j]], j + 1, 1);
    }
  }
  int q;
  cin >> q;
  while (q--) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      int x;
      scanf("%d", &x);
      char c;
      cin >> c;
      for (int i = 1; i <= 10; i++) {
        add(i, (x - 1 + i) % i, m[ss[x - 1]], x, -1);
        add(i, ((x - 1 + i) % i), m[c], x, 1);
      }
      ss[x - 1] = c;
    }
    if (op == 2) {
      int l, r;
      scanf("%d%d", &l, &r);
      string e;
      cin >> e;
      int p = 0;
      for (int j = 0; j <= e.size() - 1; j++) {
        p += query(e.size(), (l + j - 1 + e.size()) % e.size(), m[e[j]], r) -
             query(e.size(), (l + j - 1 + e.size()) % e.size(), m[e[j]], l - 1);
      }
      printf("%d\n", p);
    }
  }
  return 0;
}
