#include <bits/stdc++.h>
const int N = 1e6 + 5;
struct node {
  int e[26];
  int fail;
  std::vector<int> v;
} tr[N];
int tot = 1;
struct BIT {
  int c[N];
  void Update(int x, int val) {
    while (x <= N - 5) c[x] += val, x += x & -x;
    return;
  }
  int Query(int x) {
    int re = 0;
    while (x) re += c[x], x -= x & -x;
    return re;
  }
} bit;
int u[N], e[N], nt[N], hd[N], cnt;
void bb(int a, int b) {
  e[++cnt] = b, u[cnt] = a;
  nt[cnt] = hd[a];
  hd[a] = cnt;
  return;
}
void getfail() {
  for (int i = 0; i < 26; i++) tr[0].e[i] = 1;
  std::queue<int> q;
  q.push(1);
  while (q.size()) {
    int a = q.front();
    q.pop();
    int tp = tr[a].fail;
    if (a != 1) bb(tp, a);
    for (int i = 0; i < 26; i++) {
      int v = tr[a].e[i];
      if (v == 0) {
        tr[a].e[i] = tr[tp].e[i];
        continue;
      }
      tr[v].fail = tr[tp].e[i];
      q.push(v);
    }
  }
  return;
}
int dfn[N], all, sz[N];
void dfs(int a) {
  dfn[a] = ++all;
  sz[a] = 1;
  for (int i = hd[a]; i; i = nt[i]) {
    int v = e[i];
    dfs(v);
    sz[a] += sz[v];
  }
  return;
}
int pos[N], ask[N], ans[N];
char c[N];
void solve(int a) {
  bit.Update(dfn[a], 1);
  for (int j = 0; j < tr[a].v.size(); j++) {
    int k = tr[a].v[j];
    ans[k] =
        bit.Query(dfn[ask[k]] + sz[ask[k]] - 1) - bit.Query(dfn[ask[k]] - 1);
  }
  for (int i = 0; i < 26; i++)
    if (tr[a].e[i] != tr[tr[a].fail].e[i]) solve(tr[a].e[i]);
  bit.Update(dfn[a], -1);
  return;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int op, u;
    scanf("%d", &op);
    if (op == 1)
      u = 1;
    else
      scanf("%d", &u), u = pos[u];
    scanf("%s", c + 1);
    if (tr[u].e[c[1] - 'a'] == 0) tr[u].e[c[1] - 'a'] = ++tot;
    u = tr[u].e[c[1] - 'a'];
    pos[i] = u;
  }
  int m;
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &ask[i]);
    ask[i] = pos[ask[i]];
    scanf("%s", c + 1);
    int len = strlen(c + 1), u = 1;
    for (int j = 1; j <= len; j++) {
      if (tr[u].e[c[j] - 'a'] == 0) tr[u].e[c[j] - 'a'] = ++tot;
      u = tr[u].e[c[j] - 'a'];
    }
    tr[ask[i]].v.push_back(i);
    ask[i] = u;
  }
  getfail();
  dfs(1);
  solve(1);
  for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
  return 0;
}
