#include <bits/stdc++.h>
using namespace std;
int n, m;
int Song[400001][27];
int Tree[400001][27];
int f[400001];
int id_song[400001];
int state_query[400001];
int top = 0;
int st[400001];
int ed[400001];
int BIT[400001];
int top_song = 0;
int top_tree = 0;
int ans_query[400001];
vector<int> query_song[400001];
vector<int> AdjList[400001];
void add(int id, string s) {
  int cur = 0;
  for (int i = 0; i < s.size(); i++) {
    int nxt = s[i] - 'a' + 1;
    if (Tree[cur][nxt] == -1) Tree[cur][nxt] = ++top_tree;
    cur = Tree[cur][nxt];
  }
  state_query[id] = cur;
}
void update(int x, int val) {
  for (; x <= top; x += x & (-x)) BIT[x] += val;
}
int query(int x) {
  int ans = 0;
  for (; x > 0; x -= x & (-x)) ans += BIT[x];
  return ans;
}
void BFS() {
  queue<int> CurrList;
  for (int i = 1; i <= 26; i++) {
    if (Tree[0][i] != -1) {
      CurrList.push(Tree[0][i]);
      f[Tree[0][i]] = 0;
      AdjList[0].push_back(Tree[0][i]);
      AdjList[Tree[0][i]].push_back(0);
    } else
      Tree[0][i] = 0;
  }
  while (!CurrList.empty()) {
    int u = CurrList.front();
    CurrList.pop();
    for (int i = 1; i <= 26; i++)
      if (Tree[u][i] != -1) {
        int z = u;
        int v = Tree[u][i];
        u = f[u];
        while (Tree[u][i] == -1) u = f[u];
        f[v] = Tree[u][i];
        AdjList[Tree[u][i]].push_back(v);
        AdjList[v].push_back(Tree[u][i]);
        CurrList.push(v);
        u = z;
      }
  }
}
void Tour(int u, int p) {
  st[u] = ++top;
  for (int i = 0; i < AdjList[u].size(); i++) {
    int v = AdjList[u][i];
    if (v != p) Tour(v, u);
  }
  ed[u] = top;
}
int nxt_state(int u, int nxt) {
  if (Tree[u][nxt] != -1) return Tree[u][nxt];
  return Tree[u][nxt] = nxt_state(f[u], nxt);
}
void DFS(int u, int cur) {
  for (int i = 1; i <= 26; i++)
    if (Song[u][i]) {
      int v = nxt_state(cur, i);
      if (v) update(st[v], 1);
      for (int j = 0; j < query_song[Song[u][i]].size(); j++) {
        int id_query = query_song[Song[u][i]][j];
        int node_query = state_query[id_query];
        ans_query[id_query] = query(ed[node_query]) - query(st[node_query] - 1);
      }
      DFS(Song[u][i], v);
      if (v) update(st[v], -1);
    }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int type;
    cin >> type;
    int u = 0;
    if (type == 2) {
      cin >> u;
      u = id_song[u];
    }
    char c;
    cin >> c;
    if (!Song[u][c - 'a' + 1]) {
      Song[u][c - 'a' + 1] = ++top_song;
      id_song[i] = top_song;
    } else
      id_song[i] = Song[u][c - 'a' + 1];
  }
  for (int i = 0; i <= 400000; i++)
    for (int j = 0; j <= 26; j++) Tree[i][j] = -1;
  cin >> m;
  for (int i = 1; i <= m; i++) {
    int id;
    string s;
    cin >> id >> s;
    query_song[id_song[id]].push_back(i);
    add(i, s);
  }
  BFS();
  Tour(0, -1);
  DFS(0, 0);
  for (int i = 1; i <= m; i++) cout << ans_query[i] << '\n';
  return 0;
}
