Good Substrings

Smart Beaver recently got interested in a new word game. The point is as follows: count the number of distinct good substrings of some string s. To determine if a string is good or not the game uses rules. Overall there are n rules. Each rule is described by a group of three (p, l, r), where p is a string and l and r (l ≤ r) are integers. We’ll say that string t complies with rule (p, l, r), if the number of occurrences of string t in string p lies between l and r, inclusive. For example, string “ab”, complies with rules (“ab”, 1, 2) and (“aab”, 0, 1), but does not comply with rules (“cd”, 1, 2) and (“abab”, 0, 1).

substring s[l… r] (1 ≤ l ≤ r ≤ |s|) of string s = s 1 s 2… s |s| (|s| is a length of s) is string s l s l + 1… s r.

Consider a number of occurrences of string t in string p as a number of pairs of integers l, r (1 ≤ l ≤ r ≤ |p|) such that p[l… r] = t.

We’ll say that string t is good if it complies with all n rules. Smart Beaver asks you to help him to write a program that can calculate the number of distinct good substrings of string s. Two substrings s[x… y] and s[z… w] are cosidered to be distinct iff s[x… y] ≠ s[z… w].

Input

The first line contains string s. The second line contains integer n. Next n lines contain the rules, one per line. Each of these lines contains a string and two integers p i, l i, r i, separated by single spaces (0 ≤ l i ≤ r i ≤ |p i|). It is guaranteed that all the given strings are non-empty and only contain lowercase English letters.

The input limits for scoring 30 points are (subproblem G1):

  • 0 ≤ n ≤ 10.
  • The length of string s and the maximum length of string p is  ≤ 200.

The input limits for scoring 70 points are (subproblems G1+G2):

  • 0 ≤ n ≤ 10.
  • The length of string s and the maximum length of string p is  ≤ 2000.

The input limits for scoring 100 points are (subproblems G1+G2+G3):

  • 0 ≤ n ≤ 10.
  • The length of string s and the maximum length of string p is  ≤ 50000.

Output

Print a single integer — the number of good substrings of string s.

Examples

input

aaab
2
aa 0 0
aab 1 1

output

3

input

ltntlnen
3
n 0 0
ttlneenl 1 4
lelllt 1 1

output

2

input

a
0

output

1

Note

There are three good substrings in the first sample test: «aab», «ab» and «b».

In the second test only substrings «e» and «t» are good.

Solution:

#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <set>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <memory.h>
#include <string>
#include <sstream>

using namespace std;

const int N = 2222;

int f[N][N], len[N], can[N][N], cc[N];
char s[N], p[N];

int main() {
scanf("%s", s);
int n = strlen(s);
memset(f, 0, sizeof(f));
for (int i=n-1;i>=0;i--)
for (int j=n-1;j>=0;j--)
if (s[i] == s[j]) f[i][j] = f[i+1][j+1]+1;
else f[i][j] = 0;
len[0] = 1;
for (int i=1;i<n;i++) {
    len[i] = 1;
    for (int j=0;j<i;j++)
      if (f[i][j]+1 > len[i]) len[i] = f[i][j]+1;
}
for (int i=0;i<n;i++)
    for (int j=len[i];j<=n-i;j++) can[i][j] = 1;
  int m;
  scanf("%d", &m);
  for (int q=0;q<m;q++) {
    scanf("%s", p);
    int ll, rr;
    scanf("%d %d", &ll, &rr);
    int k = strlen(p);
    memset(f, 0, sizeof(f));
    for (int i=n-1;i>=0;i--)
for (int j=k-1;j>=0;j--)
if (s[i] == p[j]) f[i][j] = f[i+1][j+1]+1;
else f[i][j] = 0;
for (int i=0;i<n;i++) {
      for (int j=0;j<=n;j++) cc[j] = 0;
      for (int j=0;j<k;j++) cc[f[i][j]]++;
      for (int j=n;j>0;j--) cc[j-1] += cc[j];
for (int j=1;j<=n;j++)
        if (cc[j] >= ll && cc[j] <= rr) ;
        else can[i][j] = 0;
    }
  }
  int ans = 0;
  for (int i=0;i<n;i++)
    for (int j=len[i];j<=n-i;j++) ans += can[i][j];
  printf("%d\n", ans);
  return 0;
}