#include <bits/stdc++.h>
using namespace std;
int m, a[400005], n, cnt, ans[400005], tot, mp[400005], h[400005], qq,
    mp_[400005], siz[400005];
char re[400005];
struct TRIE_node {
  int f, s[26], dfn;
} pp[400005];
struct reQ {
  int u, v, i;
  bool operator<(const reQ x) const { return pp[v].dfn < pp[x.v].dfn; }
} req[400005];
struct AC_node {
  int f, fl, s[26], x, iid;
} p[400005];
struct DX {
  int v, p;
} dx[400005];
void BIT_in(int i, int x) {
  for (; i <= n; i = i + (i & -i)) a[i] += x;
}
int BIT_Q(int i) {
  int s = 0;
  for (; i; i = i & (i - 1)) s += a[i];
  return s;
}
void add(int u, int v) {
  dx[++tot].p = h[u];
  dx[tot].v = v;
  h[u] = tot;
}
void RD_dfs(int u) {
  mp_[u] = ++n;
  siz[mp_[u]] = 1;
  for (int i = h[u]; i; i = dx[i].p) {
    int v = dx[i].v;
    RD_dfs(v);
    siz[mp_[u]] += siz[mp_[v]];
  }
}
queue<int> q;
int TRIE_in(char x[]) {
  int i = 0, l = strlen(x);
  for (int j = 0; j < l; j++) {
    if (p[i].s[x[j] - 'a'])
      i = p[i].s[x[j] - 'a'];
    else {
      p[i].s[x[j] - 'a'] = ++cnt;
      p[cnt].f = i;
      p[i = cnt].x = x[j] - 'a';
    }
  }
  return i;
}
void TRIE_dfs(int u) {
  pp[u].dfn = ++cnt;
  for (int i = 0; i < 26; i++)
    if (pp[u].s[i]) TRIE_dfs(pp[u].s[i]);
}
void TRIE_AC() {
  for (int i = 0; i < 26; i++)
    if (p[0].s[i]) {
      p[p[0].s[i]].fl = 0;
      q.push(p[0].s[i]);
      add(0, p[0].s[i]);
    }
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < 26; i++)
      if (!p[u].s[i])
        p[u].s[i] = p[p[u].fl].s[i];
      else {
        p[p[u].s[i]].fl = p[p[u].fl].s[i];
        q.push(p[u].s[i]);
        add(p[p[u].s[i]].fl, p[u].s[i]);
      }
  }
}
void sol(int i, int j, int &k) {
  BIT_in(mp_[j], 1);
  while (req[k].v == i && k <= qq) {
    ans[req[k].i] = BIT_Q(mp_[req[k].u] + siz[mp_[req[k].u]] - 1) -
                    BIT_Q(mp_[req[k].u] - 1);
    k++;
  }
  for (int l = 0; l < 26; l++)
    if (pp[i].s[l]) sol(pp[i].s[l], p[j].s[l], k);
  BIT_in(mp_[j], -1);
}
int main() {
  scanf("%d", &m);
  int op, c;
  char b;
  for (int i = 1; i <= m; i++) {
    scanf("%d", &op);
    c = 0;
    if (op == 1)
      scanf(" %c", &b);
    else
      scanf("%d %c", &c, &b);
    if (!pp[mp[c]].s[b - 'a']) {
      pp[mp[c]].s[b - 'a'] = i;
      pp[i].f = mp[c];
      mp[i] = i;
    } else
      mp[i] = pp[mp[c]].s[b - 'a'];
  }
  TRIE_dfs(0);
  cnt = 0;
  tot = 0;
  scanf("%d", &qq);
  for (int k = 1; k <= qq; k++) {
    scanf("%d%s", &req[k].v, re);
    req[k].v = mp[req[k].v];
    req[k].u = TRIE_in(re);
    req[k].i = k;
  }
  TRIE_AC();
  RD_dfs(0);
  sort(req + 1, req + qq + 1);
  tot = 1;
  sol(0, 0, tot);
  for (int i = 1; i <= qq; i++) printf("%d\n", ans[i]);
  return 0;
}
