func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 8e5 + 100;   struct Bit {     int bit[N], n;     int sum(int i) {       int s = 0;       while (i > 0) {         s += bit[i];         i -= i & -i;       }       return s;     }     void add(int i, int x) {       while (i <= n) {         bit[i] += x;         i += i & -i;       }     }   } bit;   vector<int> que[N];   int t[N], ans[N];   struct AcTrie {     int next[N][26], go[N][26], fail[N], pos[N >> 1];     int root, tot;     vector<int> end[N];     int newnode() {       for (int i = 0; i < 26; ++i) next[tot][i] = -1;       end[tot++].clear();       return tot - 1;     }     void init() {       tot = 0;       pos[0] = root = newnode();     }     int flx(char c) { return c -  a ; }     void add(int i, int now, char c) {       if (next[now][flx(c)] == -1) next[now][flx(c)] = newnode();       now = next[now][flx(c)];       pos[i] = now;     }     int insert(char *buf) {       int len = strlen(buf), now = root;       for (int i = 0; i < len; ++i) {         if (next[now][flx(buf[i])] == -1) next[now][flx(buf[i])] = newnode();         now = next[now][flx(buf[i])];       }       return now;     }     void copy() {       for (int i = 0; i < tot; ++i) memcpy(go[i], next[i], sizeof(next[i]));     }     int head[N], nex[N], to[N], tol;     int l[N], r[N], dfs_clock;     void build() {       queue<int> Q;       fail[root] = root;       for (int i = 0; i < 26; ++i) {         if (next[root][i] == -1)           next[root][i] = root;         else {           fail[next[root][i]] = root;           Q.push(next[root][i]);         }       }       while (!Q.empty()) {         int now = Q.front();         Q.pop();         for (int i = 0; i < 26; ++i) {           if (next[now][i] == -1)             next[now][i] = next[fail[now]][i];           else {             fail[next[now][i]] = next[fail[now]][i];             Q.push(next[now][i]);           }         }       }       for (int i = 0; i < tot; ++i) head[i] = -1;       dfs_clock = tol = 0;       bit.n = tot;       for (int i = 1; i < tot; ++i) {         to[tol] = i;         nex[tol] = head[fail[i]];         head[fail[i]] = tol++;       }     }     void dfs1(int u) {       l[u] = ++dfs_clock;       for (int i = head[u]; ~i; i = nex[i]) dfs1(to[i]);       r[u] = dfs_clock;     }     void dfs2(int u) {       bit.add(l[u], 1);       for (int i = 0, j; i < que[u].size(); ++i) {         j = que[u][i];         ans[j] = bit.sum(r[t[j]]) - bit.sum(l[t[j]] - 1);       }       for (int i = 0; i < 26; ++i)         if (~go[u][i]) dfs2(go[u][i]);       bit.add(l[u], -1);     }   } ac;   char read_char() {     char ch = getchar();     while (ch >  z  || ch <  a ) ch = getchar();     return ch;   }   int n, m, op, x;   char s[N], c;   int main() {     scanf( %d , &n);     ac.init();     for (int i = 1; i <= n; ++i) {       scanf( %d , &op);       op == 2 ? scanf( %d , &x) : x = 0;       x = ac.pos[x];       c = read_char();       ac.add(i, x, c);     }     scanf( %d , &m);     for (int i = 0; i < m; ++i) {       scanf( %d %s , &x, s);       x = ac.pos[x];       t[i] = ac.insert(s);       que[x].push_back(i);     }     ac.copy();     ac.build();     ac.dfs1(ac.root);     ac.dfs2(ac.root);     for (int i = 0; i < m; ++i) printf( %d n , ans[i]);   }   