#include <bits/stdc++.h>
using namespace std;
const int arr = 2e5 + 10;
const int ar = 2e3 + 10;
const long double pi = acos(-1);
const long double eps = 1e-10;
const long long md = 1e9 + 7;
struct node {
  map<char, int> next;
  map<char, int> go;
  int link;
  int pred;
  int pred_go;
  node() {
    next.clear();
    go.clear();
    link = -1;
    pred = -1;
    pred_go = -1;
  }
};
node V[(int)(4e5 + 10)];
int last = 0;
int ver_request[(int)(4e5 + 10)];
void add_string(const string& s, int id) {
  int cur = 0;
  for (auto i : s) {
    if (!V[cur].next.count(i)) {
      last++;
      V[cur].next[i] = last;
      V[last].pred = cur;
      V[last].pred_go = i;
    }
    cur = V[cur].next[i];
  }
  ver_request[id] = cur;
}
int get_go(int v, char c);
int get_link(int v) {
  if (V[v].link == -1) {
    if (v == 0 || V[v].pred == 0) {
      V[v].link = 0;
    } else {
      V[v].link = get_go(get_link(V[v].pred), V[v].pred_go);
    }
  }
  return V[v].link;
}
int get_go(int v, char c) {
  if (!V[v].go.count(c)) {
    if (V[v].next.count(c)) {
      V[v].go[c] = V[v].next[c];
    } else {
      V[v].go[c] = (v == 0 ? 0 : get_go(get_link(v), c));
    }
  }
  return V[v].go[c];
}
vector<pair<int, char>> reb1[(int)(4e5 + 10)];
int F[(int)(4e5 + 10)];
void updF(int pos, int val) {
  for (int i = pos; i < (int)(4e5 + 10); i |= i + 1) {
    F[i] += val;
  }
}
int getF(int pos) {
  int res = 0;
  for (int i = pos; i >= 0; i &= i + 1, i--) {
    res += F[i];
  }
  return res;
}
int getF(int l, int r) {
  if (l > r) {
    return 0;
  }
  return getF(r) - getF(l - 1);
}
int tin[(int)(4e5 + 10)];
int tout[(int)(4e5 + 10)];
int T = 0;
void upd_on_way_to_root(int ver, int value) { updF(tin[ver], value); }
int sum_in_subtree(int ver) { return getF(tin[ver], tout[ver]); }
int ans[(int)(4e5 + 10)];
vector<int> vh[(int)(4e5 + 10)];
void dfs1(int now, int ver) {
  upd_on_way_to_root(ver, +1);
  for (auto q : vh[now]) {
    ans[q] = sum_in_subtree(ver_request[q]);
  }
  for (auto wh : reb1[now]) {
    dfs1(wh.first, get_go(ver, wh.second));
  }
  upd_on_way_to_root(ver, -1);
}
vector<int> reb2[(int)(4e5 + 10)];
void dfs2(int now) {
  tin[now] = ++T;
  for (auto wh : reb2[now]) {
    dfs2(wh);
  }
  tout[now] = T;
}
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int type;
    cin >> type;
    if (type == 1) {
      char c;
      cin >> c;
      reb1[0].push_back(make_pair(i, c));
    } else {
      int from;
      char c;
      cin >> from >> c;
      reb1[from].push_back(make_pair(i, c));
    }
  }
  int m;
  cin >> m;
  for (int i = 1; i <= m; i++) {
    int from;
    string t;
    cin >> from >> t;
    add_string(t, i);
    vh[from].push_back(i);
  }
  for (int i = 1; i <= last; i++) {
    reb2[get_link(i)].push_back(i);
  }
  dfs2(0);
  dfs1(0, 0);
  for (int i = 1; i <= m; i++) {
    cout << ans[i] << "\n";
  }
}
