func_code_string: #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;   }   