#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma comment(linker, "/STACK:2000000")
using namespace std;
using ll = long long;
using db = long double;
using ii = pair<int, int>;
const int N = 4e5 + 5, LG = 19, MOD = 1e9 + 7;
const int SQ = 450;
const long double EPS = 1e-7;
int a[N][26];
vector<int> match[N];
int failure[N];
int match_parent[N];
int q[N];
struct AC_FSM {
  int ptr = 0;
  AC_FSM() {
    memset(a, -1, sizeof a);
    memset(match_parent, -1, sizeof match_parent);
    ptr++;
  }
  void construct_automaton(vector<string> &words) {
    for (int w = 0, n = 0; w < words.size(); ++w, n = 0) {
      for (int i = 0; i < words[w].size(); ++i) {
        if (a[n][words[w][i] - 'a'] == -1) {
          a[n][words[w][i] - 'a'] = ptr++;
        }
        n = a[n][words[w][i] - 'a'];
      }
      match[n].push_back(w);
    }
    int h = 0, t = 0;
    for (int k = 0; k < 26; ++k) {
      if (a[0][k] == -1)
        a[0][k] = 0;
      else if (a[0][k] > 0) {
        failure[a[0][k]] = 0;
        q[t++] = (a[0][k]);
      }
    }
    while (h < t) {
      int r = q[h++];
      for (int k = 0, arck; k < 26; ++k) {
        if ((arck = a[r][k]) != -1) {
          q[t++] = arck;
          int v = failure[r];
          while (a[v][k] == -1) v = failure[v];
          failure[arck] = a[v][k];
          match_parent[arck] = a[v][k];
          while (match_parent[arck] != -1 && match[match_parent[arck]].empty())
            match_parent[arck] = match_parent[match_parent[arck]];
        }
      }
    }
  }
};
vector<pair<int, char>> tree[N];
vector<int> qr[N];
int qrI[N];
int cnt[N];
int ans[N];
void dfs(int node, AC_FSM &ACA, int state = 0, int ss = 0) {
  for (auto q : qr[node]) {
    ans[q] += cnt[qrI[q]];
  }
  for (auto x : tree[node]) {
    int to = x.first;
    char add = x.second;
    add -= 'a';
    int nstate = state;
    int nss = ss;
    while (a[nss][add] == -1) nss = failure[nss];
    nstate = a[nstate][add] = a[nss][add];
    for (nss = nstate; ~nss; nss = match_parent[nss])
      for (int w : match[nss]) cnt[w]++;
    dfs(to, ACA, nstate, nstate);
    for (nss = nstate; ~nss; nss = match_parent[nss])
      for (int w : match[nss]) cnt[w]--;
  }
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  char c;
  for (int i = 1; i < n + 1; i++) {
    int tp, par = 0;
    cin >> tp;
    if (tp == 2) cin >> par;
    cin >> c;
    tree[par].push_back(make_pair(i, c));
  }
  int m;
  cin >> m;
  vector<string> str(m), ord;
  vector<int> ind(m);
  for (int i = 0; i < m; i++) {
    cin >> ind[i] >> str[i];
    ord.push_back(str[i]);
  }
  sort(ord.begin(), ord.end());
  ord.resize(unique(ord.begin(), ord.end()) - ord.begin());
  AC_FSM ACA;
  ACA.construct_automaton(ord);
  for (int i = 0; i < m; i++) {
    qrI[i] = lower_bound(ord.begin(), ord.end(), str[i]) - ord.begin();
    qr[ind[i]].push_back(i);
  }
  dfs(0, ACA);
  for (int i = 0; i < m; i++) cout << ans[i] << '\n';
  return 0;
}
