#include <bits/stdc++.h>
using namespace std;
const int MAXN = 400005;
const long long MOD = 1000000007;
const long long INF = (long long)1e9 + 5;
const int SIGMA = 26;
struct Node {
  int tag, dep;
  Node *link, *nocc, *next[SIGMA];
  Node(Node *par) {
    tag = -1;
    dep = (par == NULL ? 0 : par->dep + 1);
    link = nocc = NULL;
    for (int i = 0; i < SIGMA; i++) {
      next[i] = NULL;
    }
  }
};
struct ACA {
  Node *root;
  vector<Node *> ord;
  void build(vector<string> &dict) {
    root = new Node(NULL);
    for (int i = 0; i < dict.size(); i++) {
      Node *cur = root;
      for (char ch : dict[i]) {
        int to = ch - 'a';
        if (cur->next[to] == NULL) {
          cur->next[to] = new Node(cur);
        }
        cur = cur->next[to];
      }
      cur->tag = i;
    }
    root->dep = 0;
    root->link = root;
    for (int i = 0; i < SIGMA; i++) {
      if (root->next[i] == NULL) {
        root->next[i] = root;
      }
    }
    queue<Node *> Q;
    Q.push(root);
    while (!Q.empty()) {
      Node *v = Q.front();
      Q.pop();
      ord.push_back(v);
      for (int to = 0; to < SIGMA; to++) {
        if (v->next[to]->dep > v->dep) {
          Node *u = v->next[to];
          u->link = (v == root ? root : v->link->next[to]);
          u->nocc = u->link->tag != -1 ? u->link : u->link->nocc;
          for (int j = 0; j < SIGMA; j++) {
            if (u->next[j] == NULL) {
              u->next[j] = u->link->next[j];
            }
          }
          Q.push(u);
        }
      }
    }
  }
} aca;
int N, Q, ans[MAXN], occ[MAXN];
vector<string> dict;
vector<int> child[MAXN], q_on_node[MAXN];
int qs[MAXN];
Node *cur;
int pa[MAXN];
char add[MAXN];
map<string, int> trans;
void dfs(int v) {
  for (int qid : q_on_node[v]) {
    ans[qid] = occ[qs[qid]];
  }
  for (int to : child[v]) {
    Node *store = cur;
    cur = cur->next[add[to] - 'a'];
    Node *tmp = cur;
    while (tmp != NULL) {
      if (tmp->tag != -1) occ[tmp->tag]++;
      tmp = tmp->nocc;
    }
    dfs(to);
    tmp = cur;
    while (tmp != NULL) {
      if (tmp->tag != -1) occ[tmp->tag]--;
      tmp = tmp->nocc;
    }
    cur = store;
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> N;
  for (int i = 1; i <= N; i++) {
    int t, id;
    char ch;
    cin >> t;
    if (t == 1) {
      cin >> ch;
      id = 0;
    } else {
      cin >> id >> ch;
    }
    pa[i] = id;
    child[id].push_back(i);
    add[i] = ch;
  }
  cin >> Q;
  for (int _q = 0; _q < Q; _q++) {
    int id;
    string s;
    cin >> id >> s;
    q_on_node[id].push_back(_q);
    trans.insert({s, trans.size()});
    qs[_q] = trans[s];
  }
  dict.resize(trans.size());
  for (auto &p : trans) {
    dict[p.second] = p.first;
  }
  aca.build(dict);
  cur = aca.root;
  dfs(0);
  for (int i = 0; i < Q; i++) {
    cout << ans[i] << '\n';
  }
  return 0;
}
