#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 20, MAX2 = 600;
int nxt[MAX];
char s[MAX];
int st[MAX];
vector<int> zn[100];
int len, k, L, R;
int c[MAX2];
int l[MAX2], r[MAX2];
int zo[MAX2], ro[MAX2];
int val[MAX];
unordered_set<int> SS;
inline bool cm(int v) { return v >= L && v <= R; }
int main() {
  scanf("%s", s);
  scanf("%d%d%d\n", &k, &L, &R);
  for (int i = 0; i < k; i++) {
    char cc;
    scanf("%c %d %d\n", &cc, &l[i], &r[i]);
    c[i] = cc - 'a';
  }
  len = strlen(s);
  for (int i = 0; i < len; i++) st[i] = s[i] - 'a';
  for (int i = 0; i < len; i++) zn[st[i]].push_back(i);
  for (int i = 0; i < 26; i++) {
    auto &ve = zn[i];
    for (int j = 0; j < ve.size(); j++) {
      if (j != (int)ve.size() - 1) {
        nxt[ve[j]] = ve[j + 1];
      } else
        nxt[ve[j]] = len;
    }
  }
  memset(val, 0, sizeof(val));
  for (int i = 0; i < k; i++) {
    if (l[i] == 0 && r[i] == 0) {
      if (st[0] == c[i]) {
        zo[i] = 0, ro[i] = -1;
      } else {
        int pos = 0;
        while (pos < len && st[pos] != c[i]) pos++;
        pos--;
        zo[i] = 0, ro[i] = pos;
        for (int j = zo[i]; j <= ro[i]; j++) val[j]++;
      }
    } else if (l[i] == 0 && r[i]) {
      zo[i] = 0;
      int cnt = st[0] == c[i], pos = 0;
      while (pos + 1 < len && cnt <= r[i]) {
        cnt += st[pos + 1] == c[i];
        pos++;
      }
      if (cnt > r[i]) pos--;
      ro[i] = pos;
      for (int j = zo[i]; j <= ro[i]; j++) val[j]++;
    } else {
      int cnt = st[0] == c[i], pos = 0;
      while (pos + 1 < len && cnt < l[i]) {
        cnt += st[pos + 1] == c[i];
        pos++;
      }
      if (cnt < l[i])
        zo[i] = ro[i] = len;
      else {
        zo[i] = pos;
        while (pos + 1 < len && cnt <= r[i]) {
          cnt += st[pos + 1] == c[i];
          pos++;
        }
        if (cnt > r[i]) pos--;
        ro[i] = pos;
        for (int j = zo[i]; j <= ro[i]; j++) val[j]++;
      }
    }
  }
  for (int i = 0; i < len; i++) {
    if (cm(val[i])) SS.insert(i);
  }
  long long ans = 0;
  ans += SS.size();
  for (int pos = 1; pos < len; pos++) {
    for (int i = 0; i < k; i++) {
      if (l[i] == 0 && r[i] == 0) {
        if (st[pos - 1] != c[i]) {
          int pos = zo[i];
          bool t1 = cm(val[pos]), t2 = cm(val[pos] - 1);
          val[pos]--;
          if (t1 && !t2) SS.erase(pos);
          if (!t1 && t2) SS.insert(pos);
          zo[i]++;
        } else {
          if (st[pos] == c[i])
            zo[i]++, ro[i]++;
          else {
            zo[i] = pos, ro[i] = nxt[pos - 1] - 1;
            for (int p = zo[i]; p <= ro[i]; p++) {
              bool t1 = cm(val[p]), t2 = cm(val[p] + 1);
              val[p]++;
              if (t1 && !t2) SS.erase(p);
              if (!t1 && t2) SS.insert(p);
            }
          }
        }
      } else if (l[i] == 0 && r[i]) {
        int p = zo[i];
        bool t1 = cm(val[p]), t2 = cm(val[p] - 1);
        val[p]--;
        if (t1 && !t2) SS.erase(p);
        if (!t1 && t2) SS.insert(p);
        if (st[pos - 1] == c[i]) {
          if (ro[i] != len - 1) {
            int rro = ro[i];
            ro[i] = nxt[ro[i] + 1] - 1;
            for (int p = rro + 1; p <= ro[i]; p++) {
              bool t1 = cm(val[p]), t2 = cm(val[p] + 1);
              val[p]++;
              if (t1 && !t2) SS.erase(p);
              if (!t1 && t2) SS.insert(p);
            }
          }
        }
      } else {
        if (zo[i] == len) continue;
        if (st[pos - 1] == c[i]) {
          if (nxt[zo[i]] == len) {
            for (int p = zo[i]; p <= ro[i]; p++) {
              bool t1 = cm(val[p]), t2 = cm(val[p] - 1);
              val[p]--;
              if (t1 && !t2) SS.erase(p);
              if (!t1 && t2) SS.insert(p);
            }
            zo[i] = ro[i] = len;
          } else {
            int newzo = nxt[zo[i]],
                newro = ro[i] == len - 1 ? ro[i] : nxt[ro[i] + 1] - 1;
            for (int p = zo[i]; p < newzo; p++) {
              bool t1 = cm(val[p]), t2 = cm(val[p] - 1);
              val[p]--;
              if (t1 && !t2) SS.erase(p);
              if (!t1 && t2) SS.insert(p);
            }
            for (int p = ro[i] + 1; p <= newro; p++) {
              bool t1 = cm(val[p]), t2 = cm(val[p] + 1);
              val[p]++;
              if (t1 && !t2) SS.erase(p);
              if (!t1 && t2) SS.insert(p);
            }
            zo[i] = newzo, ro[i] = newro;
          }
        }
      }
    }
    SS.erase(pos - 1);
    ans += SS.size();
  }
  printf("%lld\n", ans);
  return 0;
}
