#include <bits/stdc++.h>
using namespace std;
void getZarr(const string &str, int Z[]) {
  int n = str.length();
  int L, R, k;
  L = R = 0;
  for (int i = 1; i < n; ++i) {
    if (i > R) {
      L = R = i;
      while (R < n && str[R - L] == str[R]) R++;
      Z[i] = R - L;
      R--;
    } else {
      k = i - L;
      if (Z[k] < R - i + 1)
        Z[i] = Z[k];
      else {
        L = i;
        while (R < n && str[R - L] == str[R]) R++;
        Z[i] = R - L;
        R--;
      }
    }
  }
}
void search(const string &text, const string &pattern, int Z[]) {
  string concat = pattern + text;
  int l = concat.length();
  getZarr(concat, Z);
  for (int i = 0; i < (int)text.size(); ++i) Z[i] = Z[i + (int)pattern.size()];
}
const int mod = 998244353;
string a, l, r;
int Z1[(int)2e6 + 5];
int Z2[(int)2e6 + 5];
long long cs[1000000 + 2];
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> a >> l >> r;
  search(a, l, Z1);
  search(a, r, Z2);
  cs[a.size()] = 1;
  for (int i = (int)a.size() - 1; i >= 0; --i) {
    const long long curr = [&](const int &i) {
      if (a[i] == '0') return l != "0" ? 0 : cs[i + 1] - cs[i + 2];
      int lo = i + (int)l.size();
      int hi = i + (int)r.size();
      if (lo > (int)a.size()) return 0LL;
      if (Z1[i] < (int)l.size() && a[i + Z1[i]] < l[Z1[i]]) lo++;
      if (hi > (int)a.size())
        hi = (int)a.size();
      else {
        if (Z2[i] < (int)r.size()) {
          if (a[i + Z2[i]] > r[Z2[i]]) {
            hi--;
          }
        }
      }
      if (lo > hi) return 0LL;
      return cs[lo] - cs[hi + 1];
    }(i);
    cs[i] = (curr + cs[i + 1]) % mod;
  }
  const long long ans = ((cs[0] - cs[1]) % mod + mod) % mod;
  cout << ans << '\n';
  return 0;
}
