#include <bits/stdc++.h>
using namespace std;
const int AL = 26;
const int N = 400 * 1000 + 13;
struct node {
  int nxt[AL];
  node() { memset(nxt, -1, sizeof(nxt)); }
  int& operator[](int x) { return nxt[x]; }
};
struct node_at {
  int nxt[AL];
  int p;
  char pch;
  int link;
  int go[AL];
  node_at() {
    memset(nxt, -1, sizeof(nxt));
    memset(go, -1, sizeof(go));
    link = p = -1;
  }
  int& operator[](int x) { return nxt[x]; }
};
int cntnm;
node trienm[N];
int cntqr;
node_at trieqr[N];
int add_string(string s) {
  int v = 0;
  for (auto it : s) {
    int c = it - 'a';
    if (trieqr[v][c] == -1) {
      trieqr[cntqr] = node_at();
      trieqr[cntqr].p = v;
      trieqr[cntqr].pch = c;
      trieqr[v][c] = cntqr;
      ++cntqr;
    }
    v = trieqr[v][c];
  }
  return v;
}
int go(int v, int c);
int get_link(int v) {
  if (trieqr[v].link == -1) {
    if (v == 0 || trieqr[v].p == 0)
      trieqr[v].link = 0;
    else
      trieqr[v].link = go(get_link(trieqr[v].p), trieqr[v].pch);
  }
  return trieqr[v].link;
}
int go(int v, int c) {
  if (trieqr[v].go[c] == -1) {
    if (trieqr[v][c] != -1)
      trieqr[v].go[c] = trieqr[v][c];
    else
      trieqr[v].go[c] = (v == 0 ? 0 : go(get_link(v), c));
  }
  return trieqr[v].go[c];
}
int add_letter(int v, int c) {
  if (trienm[v][c] == -1) {
    trienm[cntnm] = node();
    trienm[v][c] = cntnm;
    ++cntnm;
  }
  return trienm[v][c];
}
vector<int> g[N];
int tin[N], tout[N], T;
void dfs_init(int v) {
  tin[v] = T++;
  for (auto u : g[v]) dfs_init(u);
  tout[v] = T;
}
int f[N];
void upd(int v, int val) {
  for (int i = tin[v]; i < N; i |= i + 1) f[i] += val;
}
int get(int x) {
  int sum = 0;
  for (int i = x; i >= 0; i = (i & (i + 1)) - 1) sum += f[i];
  return sum;
}
int sum(int v) { return get(tout[v] - 1) - get(tin[v] - 1); }
int n, m;
int nm[N], qr[N];
vector<int> nms[N];
vector<int> reqs[N];
int ans[N];
void dfs(int v, int cur) {
  upd(cur, 1);
  for (auto it : nms[v])
    for (auto q : reqs[it]) ans[q] = sum(qr[q]);
  for (int i = 0; i < int(AL); i++)
    if (trienm[v][i] != -1) dfs(trienm[v][i], go(cur, i));
  upd(cur, -1);
}
int main() {
  cntqr = 0;
  trieqr[cntqr++] = node_at();
  cntnm = 0;
  trienm[cntnm++] = node();
  char buf[N];
  scanf("%d", &n);
  for (int i = 0; i < int(n); i++) {
    int t;
    scanf("%d", &t);
    if (t == 1) {
      scanf("%s", buf);
      nm[i] = add_letter(0, buf[0] - 'a');
    } else {
      int j;
      scanf("%d%s", &j, buf);
      --j;
      nm[i] = add_letter(nm[j], buf[0] - 'a');
    }
    nms[nm[i]].push_back(i);
  }
  scanf("%d", &m);
  for (int i = 0; i < int(m); i++) {
    int j;
    scanf("%d%s", &j, buf);
    --j;
    reqs[j].push_back(i);
    qr[i] = add_string(buf);
  }
  for (int v = 1; v < cntqr; ++v) g[get_link(v)].push_back(v);
  T = 0;
  dfs_init(0);
  dfs(0, 0);
  for (int i = 0; i < int(m); i++) printf("%d\n", ans[i]);
}
