#include <bits/stdc++.h>
using namespace std;
char input[2010], sInicio[2010], sFin[2010];
long long n, nInicio, nFin, nVInicio, nVFin;
unsigned long long hInicio, hFin;
vector<vector<unsigned long long> > M;
unordered_set<unsigned long long> f;
unordered_set<unsigned long long>::iterator it;
vector<int> vInicio, vFin;
void inicializar() {
  n = strlen(input);
  nInicio = strlen(sInicio);
  nFin = strlen(sFin);
  vInicio.clear();
  vFin.clear();
  M.clear();
  M.resize(n);
  for (int i = 0; i < n; i++) M[i].resize(n);
  f.clear();
}
int main() {
  while (scanf("%s %s %s", &input, &sInicio, &sFin) == 3) {
    inicializar();
    hInicio = 0;
    for (int i = 0; i < nInicio; i++)
      hInicio = (hInicio * 27) + sInicio[i] - 'a' + 1;
    hFin = 0;
    for (int i = 0; i < nFin; i++) hFin = (hFin * 27) + sFin[i] - 'a' + 1;
    for (int i = 0; i < n; i++) {
      long long aux = 0;
      for (int j = i; j < n; j++) {
        aux = (aux * 27) + input[j] - 'a' + 1;
        M[i][j] = aux;
      }
    }
    for (int i = 0; i < n - nInicio + 1; i++)
      if (hInicio == M[i][i + nInicio - 1]) vInicio.push_back(i);
    nVInicio = vInicio.size();
    for (int i = 0; i < n - nFin + 1; i++)
      if (hFin == M[i][i + nFin - 1]) vFin.push_back(i);
    nVFin = vFin.size();
    int res = 0;
    for (int i = 0; i < nVInicio; i++) {
      for (int j = 0; j < nVFin; j++) {
        if (vInicio[i] <= vFin[j] && vInicio[i] + nInicio <= vFin[j] + nFin) {
          it = f.find(M[vInicio[i]][vFin[j] + nFin - 1]);
          if (it == f.end()) {
            res++;
            f.insert(M[vInicio[i]][vFin[j] + nFin - 1]);
          }
        }
      }
    }
    printf("%d\n", res);
  }
}
