#include <bits/stdc++.h>
using namespace std;
int q;
string s;
struct BIT {
  int N;
  vector<int> data[5][15][15];
  BIT(int n) {
    N = n;
    for (int i = 1; i <= 10; i++) {
      for (int j = 0; j < i; j++) {
        for (int k = 0; k < 4; k++) {
          data[k][i][j].resize(N + 5);
        }
      }
    }
  }
  void update(int c, int p, int val) {
    for (int q = 1; q <= 10; q++) {
      for (int r = 0; r < q; r++) {
        if ((p - r) % q == 0) {
          for (int pp = p; pp <= N; pp += pp & -pp) {
            data[c][q][r][pp] += val;
          }
        }
      }
    }
  }
  int query(int c, int q, int r, int p) {
    int ans = 0;
    for (; p > 0; p -= p & -p) {
      ans += data[c][q][r][p];
    }
    return ans;
  }
  int r_query(int c, int q, int r, int s, int e) {
    return query(c, q, r, e) - query(c, q, r, s - 1);
  }
};
int func(char c) {
  if (c == 'A') return 0;
  if (c == 'G') return 1;
  if (c == 'T') return 2;
  if (c == 'C') return 3;
}
int main() {
  cin >> s;
  int n = s.size();
  BIT tree(n);
  for (int i = 0; i < n; i++) {
    tree.update(func(s[i]), i + 1, 1);
  }
  scanf("%d", &q);
  for (int i = 0; i < q; i++) {
    int k;
    scanf("%d", &k);
    if (k == 1) {
      int p;
      char c;
      cin >> p >> c;
      tree.update(func(s[p - 1]), p, -1);
      s[p - 1] = c;
      tree.update(func(c), p, 1);
    } else {
      int l, r;
      string e;
      scanf("%d%d", &l, &r);
      cin >> e;
      int nn = e.size();
      int ans = 0;
      for (int j = 0; j < nn; j++) {
        ans += tree.r_query(func(e[j]), nn, (j + l) % nn, l, r);
      }
      cout << ans << endl;
    }
  }
  return 0;
}
