#include <bits/stdc++.h>
struct abc {
  char c;
  int x, y, l, r;
} a[510];
char c[100010], str[10];
int b[100010], next[100010], point[30];
int main() {
  long long ans = 0;
  int i, j, k, n, m, ll, rr, x, t, p, q;
  scanf("%s", c);
  n = strlen(c);
  for (i = 0; i < 30; i++) point[i] = n;
  for (i = n - 1; i >= 0; i--) {
    next[i] = point[c[i] - 'a'];
    point[c[i] - 'a'] = i;
  }
  next[n] = n;
  scanf("%d%d%d", &m, &ll, &rr);
  for (i = 0; i < m; i++) {
    scanf("%s%d%d", str, &a[i].x, &a[i].y);
    a[i].c = str[0];
    t = 0;
    a[i].l = a[i].r = n;
    if (a[i].x == 0) {
      a[i].l = 0;
    }
    if (point[a[i].c - 'a'] != n) {
      t = 1;
      x = point[a[i].c - 'a'];
      for (t = 1; t < a[i].x && x != n; t++) {
        x = next[x];
      }
      if (a[i].x != 0) {
        a[i].l = x;
      }
      for (; t <= a[i].y && x != n; t++) {
        x = next[x];
      }
      a[i].r = x;
    }
    for (j = a[i].l; j < a[i].r; j++) {
      b[j]++;
    }
  }
  t = 0;
  for (i = 0; i < n; i++) {
    if (ll <= b[i] && b[i] <= rr) {
      t++;
    }
  }
  ans = t;
  for (i = 1; i < n; i++) {
    if (ll <= b[i - 1] && b[i - 1] <= rr) {
      t--;
    }
    for (j = 0; j < m; j++) {
      if (a[j].c == c[i - 1]) {
        if (a[j].x == 0) {
          p = i;
        } else {
          p = next[a[j].l];
        }
        q = next[a[j].r];
        for (k = a[j].l; k < p; k++) {
          b[k]--;
          if (k >= i) {
            if (b[k] == rr) {
              t++;
            } else if (b[k] == ll - 1) {
              t--;
            }
          }
        }
        for (k = a[j].r; k < q; k++) {
          b[k]++;
          if (k >= i) {
            if (b[k] == ll) {
              t++;
            } else if (b[k] == rr + 1) {
              t--;
            }
          }
        }
        a[j].l = p;
        a[j].r = q;
      }
    }
    ans += t;
  }
  printf("%I64d\n", ans);
  return 0;
}
