#include <bits/stdc++.h>
using namespace std;
#pragma warning(disable : 4996)
#pragma comment(linker, "/STACK:16777216")
#pragma warning(disable : 4996)
#pragma comment(linker, "/STACK:16777216")
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
const int inf = 2000000000;
const long long linf = 5000000000000000000;
const long double LDINF = 2e18;
template <typename T>
void print(vector<T>& a) {
  for (int i = 0; i < a.size(); i++) cout << a[i] << ' ';
}
template <typename T>
void print(deque<T>& a) {
  for (int i = 0; i < a.size(); i++) cout << a[i] << ' ';
}
template <typename T>
void print(vector<vector<T>>& a) {
  for (int i = 0; i < a.size(); i++) {
    for (int j = 0; j < a[i].size(); j++) cout << a[i][j] << ' ';
    cout << '\n';
  }
}
template <typename T>
void input(vector<T>& a) {
  for (int i = 0; i < a.size(); i++) cin >> a[i];
}
template <typename T>
void input(deque<T>& a) {
  for (int i = 0; i < a.size(); i++) cin >> a[i];
}
template <typename T>
void input(vector<vector<T>>& a) {
  for (int i = 0; i < a.size(); i++)
    for (int j = 0; j < a[i].size(); j++) cin >> a[i][j];
}
long long mod = 1190494759;
int mod1 = 1e9 + 7;
long long p = 103;
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return a * b / gcd(a, b); }
vector<vector<long long>> mult(vector<vector<long long>>& A,
                               vector<vector<long long>>& B) {
  int n = A.size(), m = B[0].size();
  vector<vector<long long>> C(n, vector<long long>(m, 0));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      for (int k = 0; k < A[0].size(); k++) {
        C[i][j] += A[i][k] * B[k][j];
        C[i][j] %= mod;
      }
    }
  }
  return C;
}
vector<long long> hash1, st;
bool compare(int l1, int r1, int l2, int r2) {
  long long val1 = hash1[r1], val2 = hash1[r2];
  if (l1) val1 = (val1 - hash1[l1 - 1] + 5 * mod) % mod;
  if (l2) val2 = (val2 - hash1[l2 - 1] + 5 * mod) % mod;
  return val1 * st[l2] % mod == val2 * st[l1] % mod;
}
long long BinPow(long long a, long long n) {
  if (n == 1) return a;
  if (n == 0) return 1;
  if (n % 2 == 0) {
    long long d = BinPow(a, n / 2);
    return d * d % mod;
  } else
    return a * BinPow(a, n - 1) % mod;
}
void solve() {
  string str, s, t;
  cin >> str >> s >> t;
  int slen = s.length(), tlen = t.length(), nlen = str.length();
  str = s + t + str;
  hash1 = vector<long long>(str.length());
  st = vector<long long>(str.length());
  vector<int> begs, ens;
  st[0] = 1;
  hash1[0] = str[0];
  for (int i = 1; i < str.length(); i++) {
    st[i] = st[i - 1] * p % mod;
    hash1[i] = (hash1[i - 1] + (st[i] * str[i])) % mod;
  }
  for (int i = slen + tlen; i < str.length(); i++) {
    int l = i, r = l + slen - 1;
    if (r < str.length()) {
      if (compare(l, r, 0, slen - 1)) {
        begs.push_back(i);
      }
    }
    l = i - tlen + 1;
    r = i;
    if (l >= slen + tlen) {
      if (compare(l, r, slen, slen + tlen - 1)) {
        ens.push_back(i);
      }
    }
  }
  vector<int> ans;
  vector<long long> kek(begs.size());
  vector<vector<int>> lens(str.length() + 1);
  for (int i = 0; i < begs.size(); i++) {
    kek[i] = BinPow(st[begs[i]], mod - 2);
  }
  for (int i = 0; i < ens.size(); i++) {
    for (int j = 0; j < begs.size(); j++) {
      int len = ens[i] - begs[j] + 1;
      if (len < max(slen, tlen)) break;
      long long val = (hash1[ens[i]] - hash1[begs[j] - 1] + 5 * mod) % mod;
      val = val * kek[j] % mod;
      int l = ens[i] - begs[j] + 1;
      lens[l].push_back(val);
    }
  }
  int cnt = 0;
  for (int i = 0; i < str.length(); i++) {
    sort((lens[i]).begin(), (lens[i]).end());
    int last = -1;
    for (int j = 0; j < lens[i].size(); j++) {
      if (lens[i][j] != last) {
        cnt++;
        last = lens[i][j];
      }
    }
  }
  cout << cnt;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int tst = 1;
  while (tst--) solve();
}
