#include <bits/stdc++.h>   #pragma comment(linker,  /STACK:1024000000,1024000000 )   using namespace std;   const int Maxn = 600010, Maxm = 300005, Mo = 1000000007,             sp[8][2] = {{-1, 0}, {1, 0},   {0, 1},  {0, -1},                         {1, 1},  {-1, -1}, {1, -1}, {-1, 1}};   const long long oo = (1LL << 62);   typedef int IArr[Maxn];   typedef long long LArr[Maxn];   typedef double DArr[Maxn];   struct SA {     int fl, dep, nt[28], ct[11];   } sa[Maxn];   int total, tl, M_dep;   void init() {     memset((sa), 0, sizeof((sa)));     fill(sa[0].nt, sa[0].nt + 27, 1);     sa[0].dep = -1;     total = tl = 1;   }   void ins(int c) {     int p = tl;     int np = tl = ++total;     sa[np].dep = sa[p].dep + 1;     for (; !sa[p].nt[c]; p = sa[p].fl) sa[p].nt[c] = np;     int q = sa[p].nt[c];     if (sa[p].dep + 1 == sa[q].dep)       sa[np].fl = q;     else {       int nq = ++total;       sa[nq] = sa[q];       sa[nq].dep = sa[p].dep + 1;       sa[np].fl = sa[q].fl = nq;       for (; sa[p].nt[c] == q; p = sa[p].fl) sa[p].nt[c] = nq;     }   }   int n;   IArr ck;   vector<int> e[Maxn];   string st, s;   void dfs(int u) {     for (int i = 0; i < e[u].size(); i++) {       int v = e[u][i];       dfs(v);       for (int j = 1; j <= n; j++) sa[u].ct[j] += sa[v].ct[j];     }   }   int main() {     ios::sync_with_stdio(0);     cin >> st;     init();     for (int i = 0; i < st.size(); i++) ins(st[i] -  a );     cin >> n;     int l[20], r[20];     for (int i = 1; i <= n; i++) {       cin >> s;       cin >> l[i] >> r[i];       int p = 1;       for (int j = 0; j < s.size(); j++) {         int c = s[j] -  a ;         while (!sa[p].nt[c]) p = sa[p].fl;         int q = sa[p].nt[c];         if (sa[p].dep + 1 == sa[q].dep)           p = q;         else {           int nq = ++total;           sa[nq] = sa[q];           memset((sa[nq].ct), 0, sizeof((sa[nq].ct)));           sa[nq].dep = sa[p].dep + 1;           sa[q].fl = nq;           for (; sa[p].nt[c] == q; p = sa[p].fl) sa[p].nt[c] = nq;           p = total;         }         sa[p].ct[i]++;       }     }     for (int i = 2; i <= total; i++) e[sa[i].fl].push_back((i));     dfs(1);     long long ans = 0;     for (int i = 2; i <= total; i++) {       ck[i] = 1;       for (int j = 1; j <= n; j++)         ck[i] &= ((l[j] <= sa[i].ct[j]) && (sa[i].ct[j] <= r[j]));       if (ck[i]) ans += sa[i].dep - sa[sa[i].fl].dep;     }     cout << ans << endl;   }   