#include <bits/stdc++.h>
using namespace std;
static const int Maxn = 400005;
int n, q;
vector<pair<int, char> > g[Maxn];
vector<int> qry[Maxn];
int ans[Maxn];
struct AC_automaton {
  int tot, root;
  int tr[Maxn][26];
  int fail[Maxn], ed[Maxn];
  vector<int> gfail[Maxn];
  inline int newnode() {
    ++tot;
    memset(tr[tot], 0, 26 << 2);
    sz[tot] = 0;
    return tot;
  }
  inline void clear() {
    tot = 0, root = newnode();
    memset(ed, 0, sizeof(ed));
  }
  AC_automaton() { clear(); }
  inline void insert(const string &s, int id) {
    int now = root;
    for (int i = 0; i < (int)s.size(); ++i) {
      char ch = s[i] - 'a';
      if (!tr[now][ch]) tr[now][ch] = newnode();
      now = tr[now][ch];
    }
    ed[id] = now;
  }
  void build() {
    for (int i = 1; i <= tot; ++i) gfail[i].clear();
    queue<int> que;
    fail[root] = root;
    for (int i = 0; i < 26; ++i) {
      if (tr[root][i]) {
        fail[tr[root][i]] = root;
        que.push(tr[root][i]);
      } else
        tr[root][i] = root;
    }
    while (!que.empty()) {
      int u = que.front();
      que.pop();
      for (int i = 0; i < 26; ++i) {
        if (tr[u][i]) {
          fail[tr[u][i]] = tr[fail[u]][i];
          que.push(tr[u][i]);
        } else
          tr[u][i] = tr[fail[u]][i];
      }
    }
    for (int i = root + 1; i <= tot; ++i) gfail[fail[i]].push_back(i);
    dfs_time = 0;
    dfs(root);
  }
  int dfs_time;
  int id[Maxn], sz[Maxn];
  void dfs(int u) {
    id[u] = ++dfs_time, sz[u] = 1;
    for (int &v : gfail[u]) dfs(v), sz[u] += sz[v];
  }
  int bit[Maxn];
  inline void add(int x, int val) {
    while (x <= dfs_time) bit[x] += val, x += x & -x;
  }
  inline int qry(int x) {
    int res = 0;
    while (x) {
      res += bit[x];
      x -= x & -x;
    }
    return res;
  }
} ac;
void dfs(int u, int acu) {
  ac.add(ac.id[acu], 1);
  for (int &i : qry[u])
    ans[i] = ac.qry(ac.id[ac.ed[i]] + ac.sz[ac.ed[i]] - 1) -
             ac.qry(ac.id[ac.ed[i]] - 1);
  for (auto &v : g[u]) dfs(v.first, ac.tr[acu][v.second - 'a']);
  ac.add(ac.id[acu], -1);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL), cout.tie(NULL);
  cout << fixed << setprecision(12);
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    int op, par = 0;
    char w;
    cin >> op;
    if (op == 2) cin >> par;
    cin >> w;
    g[par].push_back({i, w});
  }
  cin >> q;
  for (int i = 1; i <= q; ++i) {
    int id;
    string str;
    cin >> id >> str;
    qry[id].push_back(i);
    ac.insert(str, i);
  }
  ac.build();
  dfs(0, ac.root);
  for (int i = 1; i <= q; ++i) printf("%d\n", ans[i]);
  return 0;
}
