#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int nxt[maxn], pos[26][maxn], cnt[maxn], top;
int ca[maxn];
char s[maxn];
struct NN {
  int pos, x;
  NN(int p = 0, int xx = 0) { pos = p, x = xx; }
} sta[maxn << 1], st[maxn];
int cmp(NN a, NN b) { return a.pos < b.pos; }
int main() {
  scanf("%s", s);
  int k, L, R, i, j, len = strlen(s);
  for (i = 0; i <= len + 1; i++) nxt[i] = len + 1;
  for (i = 1; i <= len; i++) {
    int c = s[i - 1] - 'a';
    if (cnt[c]) nxt[pos[c][cnt[c] - 1]] = i;
    pos[c][cnt[c]++] = i;
  }
  int dd = 0;
  scanf("%d%d%d", &k, &L, &R);
  for (i = 1; i <= k; i++) {
    int li, ri;
    char str[20], c;
    scanf("%s%d%d", str, &li, &ri);
    c = str[0] - 'a';
    if (cnt[c] < li) continue;
    if (li == 0)
      dd++;
    else
      sta[++top] = NN(pos[c][li - 1], 1);
    if (cnt[c] <= ri)
      sta[++top] = NN(len + 1, -1);
    else
      sta[++top] = NN(pos[c][ri], -1);
  }
  sort(sta + 1, sta + 1 + top, cmp);
  int to = 0;
  for (i = 1; i <= top; i++)
    if (i == top || sta[i].pos - sta[i + 1].pos)
      st[++to] = sta[i];
    else
      sta[i + 1].x += sta[i].x;
  memcpy(sta, st, sizeof(st));
  top = to;
  long long ans = 0;
  for (i = 1; i <= len; i++) {
    int t = dd;
    if (t >= L && t <= R) {
      if (top)
        ans += sta[1].pos - i;
      else
        ans += len + 1 - i;
    }
    for (j = 1; j <= top; j++) {
      t += sta[j].x;
      if (t <= R && t >= L) {
        if (j < top)
          ans += sta[j + 1].pos - sta[j].pos;
        else
          ans += len - sta[j].pos + 1;
      }
    }
    for (j = 1; j <= top; j++)
      if (s[sta[j].pos - 1] == s[i - 1]) sta[j].pos = nxt[sta[j].pos];
    for (j = 1; j < top; j++)
      if (sta[j].pos > sta[j + 1].pos) swap(sta[j], sta[j + 1]);
  }
  cout << ans << endl;
}
