#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 50;
int ch[MAXN][26], fail[MAXN], pos[MAXN], cnt, endp[MAXN], fa[MAXN];
int dfn[MAXN], siz[MAXN], timtot;
int N, M;
int ans[MAXN];
char s[MAXN];
vector<int> que[MAXN];
queue<int> q;
struct edge {
  int nxt, to;
} e[MAXN * 2];
int head[MAXN], edgetot;
void add(int x, int y) {
  e[++edgetot].to = y;
  e[edgetot].nxt = head[x];
  head[x] = edgetot;
}
struct BIT {
  int val[MAXN];
  inline int lowbit(int x) { return x & (-x); }
  void update(int x, int v) {
    while (x <= timtot) {
      val[x] += v;
      x += lowbit(x);
    }
  }
  int query(int x) {
    int res = 0;
    while (x > 0) {
      res += val[x];
      x -= lowbit(x);
    }
    return res;
  }
} T;
void ins() {
  fa[0] = -1;
  scanf("%d", &N);
  int now = 0;
  int cmd = 0;
  for (int i = 1; i <= N; ++i) {
    scanf("%d", &cmd);
    if (cmd == 1)
      now = 0;
    else {
      int idx;
      scanf("%d", &idx);
      now = pos[idx];
    }
    char c = getchar();
    while (c < 'a' || c > 'z') c = getchar();
    int u = c - 'a';
    if (!ch[now][u]) ch[now][u] = ++cnt;
    fa[ch[now][u]] = now;
    now = ch[now][u];
    pos[i] = now;
  }
  scanf("%d", &M);
  int tmp;
  for (int i = 1; i <= M; ++i) {
    now = 0;
    scanf("%d", &tmp);
    que[pos[tmp]].push_back(i);
    scanf("%s", s + 1);
    int len = strlen(s + 1);
    for (int j = 1; j <= len; ++j) {
      int u = s[j] - 'a';
      if (!ch[now][u]) ch[now][u] = ++cnt;
      fa[ch[now][u]] = now;
      now = ch[now][u];
    }
    endp[i] = now;
  }
}
void build() {
  for (int i = 0; i < 26; ++i)
    if (ch[0][i]) q.push(ch[0][i]);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = 0; i < 26; ++i) {
      if (!ch[x][i])
        ch[x][i] = ch[fail[x]][i];
      else {
        fail[ch[x][i]] = ch[fail[x]][i];
        q.push(ch[x][i]);
      }
    }
  }
  for (int i = 1; i <= cnt; ++i) add(fail[i], i);
}
void dfs(int x) {
  dfn[x] = ++timtot;
  siz[x] = 1;
  for (int i = head[x]; i; i = e[i].nxt) {
    int v = e[i].to;
    dfs(v);
    siz[x] += siz[v];
  }
}
void solve(int x) {
  T.update(dfn[x], 1);
  int len = que[x].size();
  for (int i = 0; i < len; ++i) {
    int idx = que[x][i];
    ans[idx] = T.query(dfn[endp[idx]] + siz[endp[idx]] - 1) -
               T.query(dfn[endp[idx]] - 1);
  }
  for (int i = 0; i < 26; ++i) {
    if (fa[ch[x][i]] != x) continue;
    solve(ch[x][i]);
  }
  T.update(dfn[x], -1);
}
void print() {
  for (int i = 1; i <= M; ++i) printf("%d\n", ans[i]);
}
int main() {
  ins();
  build();
  dfs(0);
  solve(0);
  print();
  return 0;
}
