#include <bits/stdc++.h>
using namespace std;
using ld = long double;
using ll = long long;
using vi = vector<int>;
using pii = pair<int, int>;
const int MX = 1e5;
const int MODS = 10;
int chr_2_int(char c) {
  if (c == 'A') return 0;
  if (c == 'T') return 1;
  if (c == 'G') return 2;
  return 3;
}
string s;
struct Seg {
  int desde, hasta;
  Seg *izq, *der;
  int sum[MODS][4];
  int mod;
  Seg(int i, int d, int m) : desde(i), hasta(d), mod(m), izq(NULL), der(NULL) {}
  void combina() {
    for (int m = 0; m < mod; ++m) {
      for (int letra = 0; letra < 4; ++letra) {
        sum[m][letra] = izq->sum[m][letra] + der->sum[m][letra];
      }
    }
  }
  void build() {
    memset(sum, 0, sizeof(sum));
    if (desde >= hasta) {
      int letra = chr_2_int(s[desde]);
      sum[desde % mod][letra]++;
    } else {
      int mitad = (desde + hasta) / 2;
      izq = new Seg(desde, mitad, mod);
      der = new Seg(mitad + 1, hasta, mod);
      izq->build();
      der->build();
      combina();
    }
  }
  void update(int pos, char c) {
    if (desde > pos || hasta < pos) return;
    if (desde >= hasta) {
      int letra = chr_2_int(s[desde]);
      int m = desde % mod;
      sum[m][letra]--;
      letra = chr_2_int(c);
      sum[m][letra]++;
    } else {
      izq->update(pos, c);
      der->update(pos, c);
      combina();
    }
  }
  int query(int ri, int rf, int v, char c) {
    if (desde > rf || hasta < ri) return 0;
    if (desde >= ri && hasta <= rf) {
      int letra = chr_2_int(c);
      return sum[v][letra];
    }
    int ret = 0;
    ret += izq->query(ri, rf, v, c);
    ret += der->query(ri, rf, v, c);
    return ret;
  }
};
Seg* tree[MODS + 2];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> s;
  int n = s.size();
  for (int tam = 1; tam <= MODS; tam++) {
    tree[tam] = new Seg(0, n - 1, tam);
    tree[tam]->build();
  }
  int q;
  cin >> q;
  while (q--) {
    int tipo;
    cin >> tipo;
    if (tipo == 1) {
      int x;
      cin >> x;
      x--;
      char c;
      cin >> c;
      for (int tam = 1; tam <= MODS; tam++) tree[tam]->update(x, c);
      s[x] = c;
    } else {
      int l, r;
      cin >> l >> r;
      l--;
      r--;
      string e;
      cin >> e;
      int tam = e.size();
      int act = l % tam;
      int res = 0;
      for (int m = 0; m < tam; ++m) {
        res += tree[tam]->query(l, r, act, e[m]);
        act = (act + 1) % tam;
      }
      cout << res << '\n';
    }
  }
  return 0;
}
