#include <bits/stdc++.h>
using namespace std;
const int MaxN = 4e5 + 100;
const int LogN = 20;
int Inf = 2e9 + 100;
const int dx[4] = {0, 1, 0, -1};
const int dy[4] = {1, 0, -1, 0};
const double eps = 1e-9;
int md = 2520;
struct Vert {
  int back;
  int Next[26];
  int p;
  int pch;
  Vert() {
    back = 0;
    fill(Next, Next + 26, 0);
  }
};
Vert Bor[MaxN];
int Sz = 1;
Vert dfs[MaxN];
int St = 1;
int Ends[MaxN];
int add(int j, string& s) {
  int Now = 0;
  for (int i = 0; i < (s).size(); i++) {
    if (Bor[Now].Next[s[i] - 'a'] == 0) {
      Bor[Now].Next[s[i] - 'a'] = Sz++;
    }
    Now = Bor[Now].Next[s[i] - 'a'];
  }
  return Now;
}
void get_links() {
  int Now = 0;
  queue<int> BFS;
  for (int i = 0; i < 26; i++) {
    int k = Bor[Now].Next[i];
    if (k != 0) {
      Bor[k].back = 0;
      BFS.push(k);
    } else {
      Bor[0].Next[i] = 0;
    }
  }
  while ((BFS).size()) {
    int v = BFS.front();
    BFS.pop();
    for (int i = 0; i < 26; i++) {
      int k = Bor[v].Next[i];
      if (k != 0) {
        Bor[k].back = Bor[Bor[v].back].Next[i];
        BFS.push(k);
      } else {
        Bor[v].Next[i] = Bor[Bor[v].back].Next[i];
      }
    }
  }
}
vector<int> Gr[MaxN];
int tin[MaxN], tout[MaxN], T;
void dfs_St(int v) {
  tin[v] = T++;
  for (int u : Gr[v]) dfs_St(u);
  tout[v] = T;
}
int fenv[MaxN];
int get(int v) {
  int res = 0;
  for (; v >= 0; v = (v & (v + 1)) - 1) res += fenv[v];
  return res;
}
void inc(int v, int a) {
  v = tin[v];
  for (; v < MaxN; v = (v | (v + 1))) fenv[v] += a;
}
int Sum(int v) { return get(tout[v] - 1) - get(tin[v] - 1); }
int Ans[MaxN];
vector<int> NMs[MaxN];
vector<int> Reqs[MaxN];
int Qr[MaxN];
void df(int v, int u) {
  inc(u, 1);
  for (int it : NMs[v]) {
    for (int q : Reqs[it]) {
      Ans[q] += Sum(Qr[q]);
    }
  }
  for (int i = 0; i < 26; i++) {
    if (dfs[v].Next[i] != 0) {
      df(dfs[v].Next[i], Bor[u].Next[i]);
    }
  }
  inc(u, -1);
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int N;
  cin >> N;
  int i = 0;
  while (N--) {
    int t;
    cin >> t;
    if (t == 1) {
      string s;
      cin >> s;
      int Now = 0;
      for (int i = 0; i < (s).size(); i++) {
        if (dfs[Now].Next[s[i] - 'a'] == 0) {
          dfs[Now].Next[s[i] - 'a'] = St++;
        }
        int k = dfs[Now].Next[s[i] - 'a'];
        dfs[k].p = Now;
        dfs[k].pch = s[i] - 'a';
        Now = k;
      }
      Ends[i] = Now;
    } else {
      int x;
      cin >> x;
      x--;
      char c;
      cin >> c;
      c -= 'a';
      x = Ends[x];
      if (dfs[x].Next[c] == 0) dfs[x].Next[c] = St++;
      int k = dfs[x].Next[c];
      dfs[k].p = x;
      dfs[k].pch = c;
      x = k;
      Ends[i] = x;
    }
    NMs[Ends[i]].push_back(i);
    i++;
  }
  cin >> N;
  int M = N;
  i = 0;
  vector<int> Qt;
  while (N--) {
    int a;
    cin >> a;
    string s;
    cin >> s;
    a--;
    Qr[i] = add(i, s);
    Qt.push_back(a);
    Reqs[a].push_back(i);
    i++;
  }
  get_links();
  for (int i = 1; i < Sz; i++) {
    Gr[Bor[i].back].push_back(i);
  }
  dfs_St(0);
  df(0, 0);
  for (int i = 0; i < M; i++) cout << Ans[i] << '\n';
  return 0;
}
