#include <bits/stdc++.h>
using namespace std;
struct Node {
  Node *index[30];
  Node *fail;
  Node *past;
  vector<pair<pair<int, int>, int> > que;
  int now;
  int ok;
  Node() {
    for (int i = 0; i < 30; i++) index[i] = NULL;
    fail = NULL;
    past = NULL;
    now = 0;
    ok = 1;
  }
} *root = new Node();
void add(char c[], int num, int q) {
  Node *n = root;
  for (int i = 0; c[i] != 0; i++) {
    if (!n->index[c[i] - 'a']) {
      n->index[c[i] - 'a'] = new Node();
    }
    n = n->index[c[i] - 'a'];
  }
  n->que.push_back(make_pair(make_pair(num, q), 0));
}
void ac() {
  queue<Node *> q;
  q.push(root);
  root->fail = NULL;
  while (!q.empty()) {
    Node *n = q.front();
    q.pop();
    for (int i = 0; i < 30; i++) {
      if (n->index[i]) {
        q.push(n->index[i]);
        Node *p = n->fail;
        while (p != NULL && !p->index[i]) p = p->fail;
        if (p) {
          n->index[i]->fail = p->index[i];
          if (p->index[i]->que.size())
            n->index[i]->past = p->index[i];
          else
            n->index[i]->past = p->index[i]->past;
        } else {
          n->index[i]->fail = root;
          n->index[i]->past = NULL;
        }
      }
    }
  }
}
vector<pair<int, char> > v[400005];
int ti = 0;
int in[400005];
int out[400005];
void dfs(int first) {
  in[first] = ++ti;
  for (auto it : v[first]) {
    dfs(it.first);
  }
  out[first] = ti;
}
void search(int first, Node *n) {
  Node *p = n;
  while (p) {
    while (p->now != p->que.size() &&
           in[p->que[p->now].first.first] < in[first])
      p->now++;
    if (p->now != p->que.size()) p->que[p->now].second++;
    p = p->past;
  }
  for (auto it : v[first]) {
    Node *Next = n;
    if (n->index[it.second - 'a']) {
      search(it.first, n->index[it.second - 'a']);
    } else {
      while (!Next->index[it.second - 'a'] && Next != root) Next = Next->fail;
      if (Next->index[it.second - 'a']) Next = Next->index[it.second - 'a'];
      n->index[it.second - 'a'] = Next;
      search(it.first, Next);
    }
  }
  p = n;
  while (p) {
    while (p->now != p->que.size() &&
           in[p->que[p->now].first.first] <= out[first])
      p->now++;
    if (p->now != p->que.size()) p->que[p->now].second--;
    p = p->past;
  }
}
int ans[400005];
bool cmp(const pair<pair<int, int>, int> &a,
         const pair<pair<int, int>, int> &b) {
  return in[a.first.first] < in[b.first.first];
}
void go(Node *n = root) {
  if (n) {
    for (int i = 0; i < 30; i++) {
      go(n->index[i]);
    }
    sort(n->que.begin(), n->que.end(), cmp);
  }
}
void gogo(Node *n = root) {
  if (n && n->ok) {
    n->ok = 0;
    for (int i = 0; i < 30; i++) {
      gogo(n->index[i]);
    }
    int sum = 0;
    for (auto it : n->que) {
      sum += it.second;
      ans[it.first.second] = sum;
    }
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      char c;
      scanf(" %c", &c);
      v[0].push_back(make_pair(i, c));
    } else {
      int first;
      char c;
      scanf("%d %c", &first, &c);
      v[first].push_back(make_pair(i, c));
    }
  }
  dfs(0);
  int m;
  scanf("%d", &m);
  for (int i = 0; i < m; i++) {
    int first;
    char c[400005];
    scanf("%d %s", &first, c);
    add(c, first, i);
  }
  ac();
  go();
  search(0, root);
  gogo();
  for (int i = 0; i < m; i++) printf("%d\n", ans[i]);
}
