#include <bits/stdc++.h>
using namespace std;
const int N = 400010;
char ss[N], s[N];
int fail[N], trie[N][30];
struct node {
  int v, next;
} e[N];
int n, opt, m, dfsclock, id, siz[N], tree[N], fa[N], dfsxu[N], ans[N], head[N],
    cnt, tot;
void add(int u, int v) {
  e[++cnt].v = v;
  e[cnt].next = head[u];
  head[u] = cnt;
}
vector<pair<int, int> > que[N];
struct BinaryIndexTree {
  int tree[800001];
  void clear() { memset(tree, 0, sizeof(tree)); }
  inline int lowbit(int x) { return x & (-x); }
  inline void updata(int x, int cost) {
    for (int i = x; i <= tot + 1; i += lowbit(i)) tree[i] += cost;
  }
  inline int sum(int x) {
    int sum1 = 0;
    for (int i = x; i > 0; i -= lowbit(i)) sum1 += tree[i];
    return sum1;
  }
} tt;
int add(char *t) {
  int n = strlen(t + 1), p = 0;
  for (int i = 1; i <= n; ++i) {
    if (!trie[p][t[i] - 'a']) trie[p][t[i] - 'a'] = ++tot;
    p = trie[p][t[i] - 'a'];
  }
  return p;
}
queue<int> q;
vector<int> E[N];
void build() {
  for (int i = 0; i < 26; ++i)
    if (trie[0][i]) q.push(trie[0][i]);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    E[fail[u]].push_back(u);
    for (int i = 0; i < 26; ++i) {
      if (!trie[u][i])
        trie[u][i] = trie[fail[u]][i];
      else
        fail[trie[u][i]] = trie[fail[u]][i], q.push(trie[u][i]);
    }
  }
}
void dfs1(int u) {
  dfsxu[u] = ++dfsclock;
  siz[u] = 1;
  for (int i = 0; i < E[u].size(); ++i) {
    int v = E[u][i];
    dfs1(v);
    siz[u] += siz[v];
  }
}
int getans(int p) {
  return tt.sum(dfsxu[p] + siz[p] - 1) - tt.sum(dfsxu[p] - 1);
}
void dfs(int u, int p) {
  p = trie[p][s[u] - 'a'];
  tt.updata(dfsxu[p], 1);
  for (int i = 0; i < que[u].size(); ++i)
    ans[que[u][i].second] = getans(que[u][i].first);
  for (int i = head[u]; i != 0; i = e[i].next) dfs(e[i].v, p);
  tt.updata(dfsxu[p], -1);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &opt);
    if (opt == 2) scanf("%d", &fa[i]);
    add(fa[i], i);
    scanf("%s", &s[i]);
  }
  scanf("%d", &m);
  for (int i = 1; i <= m; ++i) {
    scanf("%d %s", &id, ss + 1);
    que[id].push_back(make_pair(add(ss), i));
  }
  build();
  dfs1(0);
  for (int i = 1; i <= n; ++i)
    if (!fa[i]) dfs(i, 0);
  for (int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
  return 0;
}
