#include <bits/stdc++.h>
using namespace std;
char s[100005], ss[5];
int k, L, R, n, cnt[26], last[26], w[26][100005], sum0;
int tol, in_lines[26][1005];
long long ans;
struct Line {
  int t, num;
};
map<int, Line> mm;
struct Constriction {
  int w, num, c, j;
} change[26][505 * 2], lines[2][505 * 2];
bool cmp(Constriction a, Constriction b) { return a.w < b.w; }
int main() {
  scanf("%s", s);
  scanf("%d%d%d", &k, &L, &R);
  memset(cnt, 0, sizeof(cnt));
  for (int i = 0; i < k; i++) {
    int l, r;
    scanf("%s%d%d", ss, &l, &r);
    int c = ss[0] - 'a';
    change[c][cnt[c]].w = l;
    change[c][cnt[c]++].num = 1;
    change[c][cnt[c]].w = r + 1;
    change[c][cnt[c]++].num = -1;
  }
  for (int c = 0; c < 26; c++) {
    if (cnt[c] == 0) continue;
    sort(change[c], change[c] + cnt[c], cmp);
    int k = 1;
    for (int i = 1; i < cnt[c]; i++) {
      if (change[c][i].w == change[c][k - 1].w)
        change[c][k - 1].num += change[c][i].num;
      else
        change[c][k++] = change[c][i];
    }
    if (change[c][0].w == 0) {
      sum0 += change[c][0].num;
      for (int i = 1; i < k; i++) change[c][i - 1] = change[c][i];
      k--;
    }
    cnt[c] = k;
  }
  ans = 0;
  n = strlen(s);
  memset(last, 0, sizeof(last));
  mm[-1].num = 0;
  lines[0][0].w = -1;
  lines[0][0].num = 0;
  lines[0][0].c = -1;
  tol = 1;
  for (int i = 0; i < n; i++) {
    int c = s[i] - 'a', g = i % 2, h = (i + 1) % 2, t = 0, dif = 0;
    w[c][++w[c][0]] = i;
    for (int j = cnt[c] - 1; j >= 0; j--) {
      int k = w[c][0] - change[c][j].w + 1;
      if (k < 1) continue;
      if (k == 1) {
        for (; lines[g][t].w < w[c][k] && t < tol; t++) {
          lines[h][t + dif] = lines[g][t];
        }
        lines[h][t + dif].w = w[c][k];
        lines[h][t + dif].num = change[c][j].num;
        lines[h][t + dif].c = c;
        lines[h][t + dif].j = j;
        dif++;
      } else {
        for (; lines[g][t].c != c || lines[g][t].j != j; t++)
          lines[h][t + dif] = lines[g][t];
        dif--;
        for (t = t + 1; lines[g][t].w < w[c][k] && t < tol; t++)
          lines[h][t + dif] = lines[g][t];
        lines[h][t + dif].w = w[c][k];
        lines[h][t + dif].num = change[c][j].num;
        lines[h][t + dif].c = c;
        lines[h][t + dif].j = j;
        dif++;
      }
    }
    for (; t < tol; t++) lines[h][t + dif] = lines[g][t];
    tol += dif;
    int now = sum0, j = i;
    for (int t = tol - 1; t >= 0; t--) {
      if (now >= L && now <= R) ans += j - lines[h][t].w;
      j = lines[h][t].w;
      now += lines[h][t].num;
    }
  }
  cout << ans << endl;
  return 0;
}
