#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int g[maxn][10][10][4];
int ans[10][4];
char s[maxn];
int idx(char key) {
  if (key == 'A')
    return 0;
  else if (key == 'G')
    return 1;
  else if (key == 'C')
    return 2;
  else
    return 3;
}
inline int lowbit(int x) { return x & -x; }
void add(int pos, char c, int val) {
  int key = idx(c);
  for (int i = pos; i < maxn; i += lowbit(i))
    for (int mod = 0; mod < 10; mod++) g[i][mod][pos % (mod + 1)][key] += val;
}
void query(int pt, int mod, int val) {
  for (int i = pt; i >= 1; i -= lowbit(i))
    for (int pos = 0; pos <= mod; pos++)
      for (int key = 0; key < 4; key++)
        ans[pos][key] += val * g[i][mod][pos][key];
}
int query(int n, int l, int r, char str[]) {
  memset(ans, 0, sizeof(ans));
  int mod = strlen(str);
  query(r, mod - 1, 1);
  query(l - 1, mod - 1, -1);
  int mapping[10];
  for (int i = 0; i < mod; i++) mapping[i] = (l + i) % mod;
  int ret = 0;
  for (int i = 0; i < mod; i++) {
    ret += ans[mapping[i]][idx(str[i])];
  }
  return ret;
}
int main() {
  scanf("%s", s + 1);
  int n = strlen(s + 1);
  for (int i = 1; i <= n; i++) add(i, s[i], 1);
  int q;
  scanf("%d", &q);
  char str[15];
  while (q--) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      int pos;
      scanf("%d %s", &pos, str);
      add(pos, s[pos], -1);
      s[pos] = str[0];
      add(pos, s[pos], 1);
    } else {
      int l, r;
      scanf("%d %d %s", &l, &r, str);
      int ret = query(n, l, r, str);
      printf("%d\n", ret);
    }
  }
  return 0;
}
