#include <bits/stdc++.h>
using namespace std;
const int inf = INT_MAX, df = 8e5 + 7;
int i, j, k = 1, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, le[df], rig[df],
          c[df][26], ma[df << 1], head[df], pos[df << 1], tot, ans[df],
          fail[df], cnt, yet[df][26];
struct node {
  int sum, id;
};
vector<node> vec[df];
struct edge {
  int to, nxt;
} e[df << 1];
void add(int u, int v) {
  e[++o] = (edge){v, head[u]}, head[u] = o;
  return;
}
char ch[df], st[df];
void upd(int x, int y) {
  if (!x) return;
  for (int i = x; i <= 800000; i += (i & -i)) ma[i] += y;
  return;
}
int qry(int x) {
  int as = 0;
  for (int i = x; i; i -= (i & -i)) as += ma[i];
  return as;
}
void insert1(int now, int v, int id) {
  if (!c[now][v]) c[now][v] = ++tot;
  pos[id] = c[now][v];
  return;
}
void insert2(char *s, int id) {
  int len = strlen(s), now = 0;
  for (int i = (0); i <= (len - 1); ++i) {
    int v = s[i] - 'a';
    if (!c[now][v]) c[now][v] = ++tot;
    now = c[now][v];
  }
  pos[id + n] = now;
  return;
}
void init() {
  scanf("%d", &n);
  for (int i = (1); i <= (n); ++i) {
    int op, x;
    scanf("%d", &op);
    if (op == 1) {
      scanf("%s", ch), insert1(0, ch[0] - 'a', i);
    }
    if (op == 2) {
      scanf("%d", &x);
      scanf("%s", ch);
      insert1(pos[x], ch[0] - 'a', i);
    }
  }
  scanf("%d", &t);
  for (int i = (1); i <= (t); ++i) {
    int x;
    scanf("%d", &x), scanf("%s", st);
    insert2(st, i);
    vec[pos[x]].push_back((node){pos[i + n], i});
  }
  return;
}
void build() {
  queue<int> que;
  for (int i = (0); i <= (25); ++i)
    if (c[0][i]) fail[c[0][i]] = 0, que.push(c[0][i]), yet[0][i] = 1;
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    for (int i = (0); i <= (25); ++i) {
      if (c[u][i])
        fail[c[u][i]] = c[fail[u]][i], yet[u][i] = 1, que.push(c[u][i]);
      else
        c[u][i] = c[fail[u]][i];
    }
  }
  return;
}
void dfs1(int u) {
  le[u] = ++cnt;
  for (int i = head[u]; i; i = e[i].nxt) dfs1(e[i].to);
  rig[u] = cnt;
  return;
}
void dfs2(int u) {
  upd(le[u], 1);
  int siz = vec[u].size() - 1;
  for (int i = (0); i <= (siz); ++i) {
    int l = le[vec[u][i].sum], r = rig[vec[u][i].sum];
    ans[vec[u][i].id] = qry(r) - qry(l - 1);
  }
  for (int i = (0); i <= (25); ++i)
    if (yet[u][i]) dfs2(c[u][i]);
  upd(le[u], -1);
  return;
}
int main() {
  init();
  build();
  for (int i = (1); i <= (tot); ++i) add(fail[i], i);
  dfs1(0);
  dfs2(0);
  for (int i = (1); i <= (t); ++i) printf("%d\n", ans[i]);
  return 0;
}
