#include <bits/stdc++.h>
using namespace std;
struct bit {
  int fen[100111];
  bit() { memset(fen, 0, sizeof(fen)); }
  void add(int ind, int val) {
    while (ind < 100111) {
      fen[ind] += val;
      ind += (ind & -ind);
    }
  }
  int query(int ind) {
    int ret = 0;
    while (ind) {
      ret += fen[ind];
      ind -= (ind & -ind);
    }
    return ret;
  }
};
bit arr[4][11][11];
char str[100111];
char pat[15];
map<char, int> m;
int main() {
  int n;
  scanf("%s", str + 1);
  n = strlen(str + 1);
  m['A'] = 0;
  m['T'] = 1;
  m['G'] = 2;
  m['C'] = 3;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= 10; j++) {
      int mod = i % j;
      arr[m[str[i]]][j][mod].add(i, 1);
    }
  }
  int q;
  scanf("%d", &q);
  while (q--) {
    int t, x, l, d;
    char c[1];
    scanf("%d", &t);
    if (t == 1) {
      scanf("%d%s", &x, c);
      for (int j = 1; j <= 10; j++) {
        int mod = x % j;
        arr[m[str[x]]][j][mod].add(x, -1);
      }
      str[x] = c[0];
      for (int j = 1; j <= 10; j++) {
        int mod = x % j;
        arr[m[str[x]]][j][mod].add(x, 1);
      }
    }
    if (t == 2) {
      scanf("%d%d%s", &l, &d, pat + 1);
      int dol = strlen(pat + 1);
      int cur = 0;
      for (int i = 1; i <= dol; i++) {
        cur += arr[m[pat[i]]][dol][(l + i - 1) % dol].query(d) -
               arr[m[pat[i]]][dol][(l + i - 1) % dol].query(l - 1);
      }
      printf("%d\n", cur);
    }
  }
  return 0;
}
