#include <bits/stdc++.h>
using namespace std;
const int maxn = 8e5 + 5;
int n, m, ch[maxn][26], trie[maxn][26], idx, fail[maxn], id[maxn], tag[maxn],
    num[maxn], tot;
char s[maxn >> 1];
struct query {
  int i, idd, ans;
} ask[maxn >> 1];
bool cmp1(query x, query y) { return num[id[x.i]] < num[id[y.i]]; }
bool cmp2(query x, query y) { return x.idd < y.idd; }
struct edge {
  int to, next;
} e[maxn];
int head[maxn], cnt, sz[maxn], dfn[maxn], df;
void adde(int u, int v) {
  e[++cnt].to = v;
  e[cnt].next = head[u];
  head[u] = cnt;
}
void build() {
  queue<int> q;
  for (int i = (0); i <= (25); ++i)
    if (ch[0][i]) fail[ch[0][i]] = 0, q.push(ch[0][i]);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = (0); i <= (25); ++i) {
      if (ch[u][i])
        fail[ch[u][i]] = ch[fail[u]][i], q.push(ch[u][i]);
      else
        ch[u][i] = ch[fail[u]][i];
    }
  }
}
void search(int u) {
  if (tag[u]) num[u] = ++tot;
  for (int i = (0); i <= (25); ++i)
    if (ch[u][i]) search(ch[u][i]);
}
void dfs1(int u) {
  sz[u] = 1;
  dfn[u] = ++df;
  for (int i = head[u]; i; i = e[i].next) dfs1(e[i].to), sz[u] += sz[e[i].to];
}
int c[maxn];
int lowbit(int x) { return x & -x; }
void add(int x, int val) {
  for (; x <= df; x += lowbit(x)) c[x] += val;
}
int sum(int x) {
  int res = 0;
  for (; x; x -= lowbit(x)) res += c[x];
  return res;
}
int q = 1;
void dfs2(int u) {
  for (; q <= m && u == id[ask[q].i]; q++)
    ask[q].ans = sum(dfn[id[ask[q].idd]] + sz[id[ask[q].idd]] - 1) -
                 sum(dfn[id[ask[q].idd]] - 1);
  if (q == m + 1) return;
  for (int i = (0); i <= (25); ++i)
    if (trie[u][i])
      add(dfn[trie[u][i]], 1), dfs2(trie[u][i]), add(dfn[trie[u][i]], -1);
}
int read() {
  int res = 0, f = 1;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = -1;
  } while (!isdigit(ch));
  do {
    res = res * 10 + ch - '0';
    ch = getchar();
  } while (isdigit(ch));
  return res * f;
}
int main() {
  n = read();
  for (int i = (1); i <= (n); ++i) {
    int op = read(), y, u = 0;
    char z;
    if (op == 2) y = read(), u = id[y];
    do {
      z = getchar();
    } while (!isalpha(z));
    if (!ch[u][z - 'a']) ch[u][z - 'a'] = ++idx;
    u = ch[u][z - 'a'];
    tag[u] = 1;
    id[i] = u;
  }
  search(0);
  memcpy(trie, ch, sizeof(ch));
  m = read();
  for (int i = (1); i <= (m); ++i) {
    ask[i].i = read();
    scanf("%s", s + 1);
    int len = strlen(s + 1), u = 0;
    for (int j = (1); j <= (len); ++j) {
      if (!ch[u][s[j] - 'a']) ch[u][s[j] - 'a'] = ++idx;
      u = ch[u][s[j] - 'a'];
    }
    id[n + i] = u;
    ask[i].idd = n + i;
  }
  build();
  for (int i = (1); i <= (idx); ++i) adde(fail[i], i);
  dfs1(0);
  sort(ask + 1, ask + m + 1, cmp1);
  dfs2(0);
  sort(ask + 1, ask + m + 1, cmp2);
  for (int i = (1); i <= (m); ++i) printf("%d\n", ask[i].ans);
  return 0;
}
