#include <bits/stdc++.h>
using namespace std;
const int m = 26;
int q[400010];
int qb, qf, used;
struct node {
  int nxt[30], fail;
  void clear() {
    memset(nxt, -1, sizeof nxt);
    fail = -1;
  }
} mem[400010];
struct AC_automation {
  int newnode() {
    int ans = ++used;
    mem[ans].clear();
    return ans;
  }
  void init() {
    used = -1;
    newnode();
    qb = qf = 0;
  }
  int insert(char *s, int n) {
    int now = 0;
    for (int i = 0; i < n; i++) {
      if (mem[now].nxt[s[i] - 'a'] == -1) mem[now].nxt[s[i] - 'a'] = newnode();
      now = mem[now].nxt[s[i] - 'a'];
    }
    return now;
  }
  void build() {
    mem[0].fail = 0;
    for (int i = 0; i < m; i++) {
      if (mem[0].nxt[i] == -1)
        mem[0].nxt[i] = 0;
      else {
        mem[mem[0].nxt[i]].fail = 0;
        q[qb++] = mem[0].nxt[i];
      }
    }
    while (qb > qf) {
      int u = q[qf++];
      for (int i = 0; i < m; i++) {
        if (mem[u].nxt[i] == -1)
          mem[u].nxt[i] = mem[mem[u].fail].nxt[i];
        else {
          mem[mem[u].nxt[i]].fail = mem[mem[u].fail].nxt[i];
          q[qb++] = mem[u].nxt[i];
        }
      }
    }
  }
} ac;
char s[400010];
vector<int> adj[400010], pat[400010];
char que[400010];
vector<pair<int, int> > ans[400010];
int st;
int id[400010], L[400010], R[400010];
void dfs(int u) {
  st++;
  id[u] = st;
  L[u] = st;
  for (int v : pat[u]) dfs(v);
  R[u] = st;
}
int B[400010];
void update(int u, int first) {
  while (u < 400010) {
    B[u] += first;
    u += u & (-u);
  }
}
int calc(int u) {
  int ans = 0;
  while (u > 0) {
    ans += B[u];
    u -= u & (-u);
  }
  return ans;
}
int f[400010];
int vst[400010];
int res[400010];
void redfs(int u, int fa = 0) {
  vst[u] = 1;
  f[u] = mem[f[fa]].nxt[s[u] - 'a'];
  update(id[f[u]], 1);
  for (pair<int, int> v : ans[u])
    res[v.second] = calc(R[v.first]) - calc(L[v.first] - 1);
  for (int v : adj[u]) redfs(v, u);
  update(id[f[u]], -1);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int ok;
    scanf("%d", &ok);
    char t;
    if (ok == 1) {
      scanf(" %c ", &t);
      s[i] = t;
    } else {
      int j;
      scanf("%d %c ", &j, &t);
      s[i] = t;
      adj[j].push_back(i);
    }
  }
  ac.init();
  int m;
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) {
    int id;
    scanf("%d%s", &id, que);
    int len = strlen(que);
    int jd = ac.insert(que, len);
    ans[id].push_back(pair<int, int>(jd, i));
  }
  ac.build();
  for (int i = 1; i <= used; i++) pat[mem[i].fail].push_back(i);
  dfs(0);
  for (int i = 1; i <= n; i++) {
    if (vst[i]) continue;
    redfs(i);
  }
  for (int i = 1; i <= m; i++) printf("%d\n", res[i]);
  return 0;
}
