func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxN = 1e6 + 1e5 + 5;   struct Node {     int len, pa;     int trans[26];   } st[maxN + 1];   int n, m, last, cnt;   int L[11], R[11];   int sum[11][maxN + 1];   char s[maxN + 1];   vector<int> son[maxN + 1];   inline int insert(int c) {     if (st[last].trans[c] && st[st[last].trans[c]].len == st[last].len + 1)       return st[last].trans[c];     int np = ++cnt, p = last, f = np;     st[np].len = st[p].len + 1;     while (p && !st[p].trans[c]) st[p].trans[c] = np, p = st[p].pa;     if (!p)       st[np].pa = 1;     else {       int q = st[p].trans[c];       if (st[q].len == st[p].len + 1)         st[np].pa = q;       else {         int nq = ++cnt;         if (p == last) f = nq;         st[nq] = st[q];         st[nq].len = st[p].len + 1;         st[np].pa = st[q].pa = nq;         while (p && st[p].trans[c] == q) st[p].trans[c] = nq, p = st[p].pa;       }     }     return f;   }   inline void calc(int u) {     for (int i = 0; i < son[u].size(); i++) {       int v = son[u][i];       calc(v);       for (int j = 0; j <= m; j++) sum[j][u] += sum[j][v];     }   }   int main() {     scanf( %s , s + 1);     n = strlen(s + 1);     last = cnt = 1;     for (int i = 1; i <= n; i++) last = insert(s[i] -  a ), sum[0][last]++;     scanf( %d , &m);     for (int i = 1; i <= m; i++) {       scanf( %s %d %d , s + 1, &L[i], &R[i]);       int len = strlen(s + 1);       last = 1;       for (int j = 1; j <= len; j++) last = insert(s[j] -  a ), sum[i][last]++;     }     for (int i = 1; i <= cnt; i++) son[st[i].pa].push_back(i);     calc(1);     long long ans = 0;     for (int i = 2; i <= cnt; i++) {       if (!sum[0][i]) continue;       bool flag = true;       for (int j = 1; j <= m; j++)         if (sum[j][i] < L[j] || sum[j][i] > R[j]) {           flag = false;           break;         }       if (flag) ans += st[i].len - st[st[i].pa].len;     }     printf( %lld , ans);     return 0;   }   