func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long N = 1e6 + 5;   const long long mod = 998244353;   set<long long> pre, cur;   string s, mn, mx;   long long zmin[2 * N];   long long zmax[2 * N];   long long dmin[N];   long long dmax[N];   long long dp[N];   long long n;   void init() {     long long n, m, l, r;     string str;     n = s.size();     m = mn.size();     l = r = 0;     str = mn +  #  + s;     for (long long i = 1; i <= n + m; i++) {       long long &x = zmin[i];       if (i <= r) x = min(zmin[i - l], r - i);       while (i + x <= n + m && str[x] == str[i + x]) x++;       if (i + x >= r) {         l = i;         r = i + x;       }       if (i > m) dmin[i - m] = i - m + x;     }     n = s.size();     m = mx.size();     l = r = 0;     str = mx +  #  + s;     for (long long i = 1; i <= n + m; i++) {       long long &x = zmax[i];       if (i <= r) x = min(zmax[i - l], r - i);       while (i + x <= n + m && str[x] == str[i + x]) x++;       if (i + x >= r) {         l = i;         r = i + x;       }       if (i > m) dmax[i - m] = i - m + x;     }   }   bool ok(long long l, long long r) {     if (r - l + 1 > mx.size()) return false;     if (r - l + 1 == mx.size()) {       long long mid = dmax[l];       if (mid <= r && s[mid] > mx[mid - l]) return false;     }     if (r - l + 1 < mn.size()) return false;     if (r - l + 1 == mn.size()) {       long long mid = dmin[l];       if (mid <= r && s[mid] < mn[mid - l]) return false;     }     return true;   }   void add(long long &a, long long b) {     a += b;     if (a >= mod) a -= mod;   }   void sub(long long &a, long long b) {     a -= b;     if (a < 0) a += mod;   }   void solve() {     long long sum = 0;     dp[0] = 1;     for (long long i = 1; i <= n; i++) {       dp[i] = 0;       while (pre.size()) {         long long pos = *pre.begin();         if (ok(pos, i)) {           cur.insert(pos);           pre.erase(pos);           add(sum, dp[pos - 1]);         } else           break;       }       while (cur.size()) {         long long pos = *cur.begin();         if (!ok(pos, i)) {           cur.erase(pos);           sub(sum, dp[pos - 1]);         } else           break;       }       dp[i] = sum;       if (ok(i, i)) {         add(dp[i], dp[i - 1]);         if (s[i] !=  0 ) {           cur.insert(i);           add(sum, dp[i - 1]);         }       } else if (s[i] !=  0 )         pre.insert(i);     }     cout << dp[n] <<   n ;   }   void brute() {     dp[0] = 1;     for (long long i = 1; i <= n; i++) {       dp[i] = 0;       for (long long j = 0; j < i; j++) {         if (ok(j + 1, i) && !(j + 1 != i && s[j + 1] ==  0 )) add(dp[i], dp[j]);       }     }     cout << dp[n] <<   n ;   }   signed main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cin >> s >> mn >> mx;     init();     n = s.size();     s =     + s;     solve();     return 0;   }   