func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 400010;   char ss[N], s[N];   int fail[N], trie[N][30];   struct node {     int v, next;   } e[N];   int n, opt, m, dfsclock, id, siz[N], tree[N], fa[N], dfsxu[N], ans[N], head[N],       cnt, tot;   void add(int u, int v) {     e[++cnt].v = v;     e[cnt].next = head[u];     head[u] = cnt;   }   vector<pair<int, int> > que[N];   struct BinaryIndexTree {     int tree[800001];     void clear() { memset(tree, 0, sizeof(tree)); }     inline int lowbit(int x) { return x & (-x); }     inline void updata(int x, int cost) {       for (int i = x; i <= tot + 1; i += lowbit(i)) tree[i] += cost;     }     inline int sum(int x) {       int sum1 = 0;       for (int i = x; i > 0; i -= lowbit(i)) sum1 += tree[i];       return sum1;     }   } tt;   int add(char *t) {     int n = strlen(t + 1), p = 0;     for (int i = 1; i <= n; ++i) {       if (!trie[p][t[i] -  a ]) trie[p][t[i] -  a ] = ++tot;       p = trie[p][t[i] -  a ];     }     return p;   }   queue<int> q;   vector<int> E[N];   void build() {     for (int i = 0; i < 26; ++i)       if (trie[0][i]) q.push(trie[0][i]);     while (!q.empty()) {       int u = q.front();       q.pop();       E[fail[u]].push_back(u);       for (int i = 0; i < 26; ++i) {         if (!trie[u][i])           trie[u][i] = trie[fail[u]][i];         else           fail[trie[u][i]] = trie[fail[u]][i], q.push(trie[u][i]);       }     }   }   void dfs1(int u) {     dfsxu[u] = ++dfsclock;     siz[u] = 1;     for (int i = 0; i < E[u].size(); ++i) {       int v = E[u][i];       dfs1(v);       siz[u] += siz[v];     }   }   int getans(int p) {     return tt.sum(dfsxu[p] + siz[p] - 1) - tt.sum(dfsxu[p] - 1);   }   void dfs(int u, int p) {     p = trie[p][s[u] -  a ];     tt.updata(dfsxu[p], 1);     for (int i = head[u]; i != 0; i = e[i].next) dfs(e[i].v, p);     for (int i = 0; i < que[u].size(); ++i)       ans[que[u][i].second] = getans(que[u][i].first);     tt.updata(dfsxu[p], -1);   }   int main() {     scanf( %d , &n);     for (int i = 1; i <= n; ++i) {       scanf( %d , &opt);       if (opt == 2) scanf( %d , &fa[i]);       add(fa[i], i);       scanf( %s , &s[i]);     }     scanf( %d , &m);     for (int i = 1; i <= m; ++i) {       scanf( %d %s , &id, ss + 1);       que[id].push_back(make_pair(add(ss), i));     }     build();     dfs1(0);     for (int i = 1; i <= n; ++i)       if (!fa[i]) dfs(i, 0);     for (int i = 1; i <= m; ++i) printf( %d n , ans[i]);     return 0;   }   