func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long maxn = 5e5 + 10;   const long long mod = 998244353;   const long long base = 1e9;   mt19937_64 rnd;   struct Hashing {     vector<vector<vector<long long>>> f;     vector<long long> mod;     vector<vector<long long>> mu;     vector<long long> chr;     long long num;     long long base;     void init(long long num1) {       num = num1;       vector<long long> vt = {999244369, 999254351, 999154309, 989154311,                               989254411, 997254397, 991294387, 991814399,                               994114351, 994914359, 994024333};       random_shuffle(vt.begin(), vt.end());       base = 317;       for (int i = 1; i <= 26; i++) chr.push_back(abs((long long)(rnd())));       for (int i = 0; i < num; i++) {         f.emplace_back();         mod.push_back(vt[i]);         vector<long long> pt;         pt.push_back(1);         for (int j = 1; j < maxn; j++) {           pt.push_back((pt.back() * base) % mod[i]);         }         mu.push_back(pt);       }     }     long long add(string s) {       long long n = s.length();       long long id = f[0].size();       for (int j = 0; j < num; j++) {         vector<long long> vt1;         vt1.push_back(0);         for (int i = 1; i <= n; i++) {           vt1.push_back((vt1.back() * base + chr[s[i - 1] -  a ]) % mod[j]);         }         f[j].push_back(vt1);       }       return id;     }     long long get_hash(long long id, long long l, long long r) {       long long i = num - 1;       return ((f[i][id][r] - f[i][id][l - 1] * mu[i][r - l + 1]) % mod[i] +               mod[i]) %              mod[i];     }   };   int mn[maxn];   int mn1[maxn];   int nxt[maxn];   int par[maxn];   int find_par(int u) {     if (par[u] < 0) return u;     return par[u] = find_par(par[u]);   }   void dsu(int x, int y) {     x = find_par(x);     y = find_par(y);     if (x == y) return;     if (par[x] > par[y]) swap(x, y);     par[x] += par[y];     nxt[x] = max(nxt[x], nxt[y]);     par[y] = x;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     if (fopen( t.inp ,  r )) {       freopen( test.inp ,  r , stdin);       freopen( test.out ,  w , stdout);     }     int n, m, k;     cin >> n >> m >> k;     string s;     cin >> s;     string t;     cin >> t;     Hashing man;     man.init(1);     int id_s = man.add(s);     int id_t = man.add(t);     mn[0] = 1;     mn1[0] = n - k + 1;     for (int i = 1; i <= m; i++) {       mn[i] = base;       mn1[i] = -base;       nxt[i] = i;       par[i] = -1;     }     for (int i = 1; i <= n; i++) {       long long l = 1, h = min(n - i + 1, m);       while (l <= h) {         long long mid = (l + h) / 2;         if (man.get_hash(id_s, i, i + mid - 1) == man.get_hash(id_t, 1, mid))           l = mid + 1;         else           h = mid - 1;       }       if (h == m) {         if (i + 2 * k - 1 <= n) {           cout <<  Yes                 <<   n ;           cout << i <<     << i + k <<   n ;           return 0;         } else {           cout <<  Yes                 <<   n ;           cout << n - 2 * k + 1 <<     << n - k + 1 <<   n ;           return 0;         }       }       if (h && i + h - 1 >= k) {         int ed = h;         int st = max(k - i, 0) + 1;         int nw = st;         while (nw <= ed) {           if (mn[nw] != base) {             nw = nxt[find_par(nw)] + 1;           } else {             mn[nw] = i + nw - k;             if (nw > 1 && mn[nw - 1] != base) dsu(nw, nw - 1);             if (nw < m && mn[nw + 1] != base) dsu(nw, nw + 1);             nw++;           }         }       }     }     for (int i = 1; i <= m; i++) nxt[i] = i, par[i] = -1;     for (int i = n; i >= 1; i--) {       int l = 1, h = min(i, m);       while (l <= h) {         int mid = (l + h) / 2;         if (man.get_hash(id_s, i - mid + 1, i) ==             man.get_hash(id_t, m - mid + 1, m))           l = mid + 1;         else           h = mid - 1;       }       if (h == m) {         if (i - 2 * k + 1 >= 1) {           cout <<  Yes                 <<   n ;           cout << i - 2 * k + 1 <<     << i - k + 1 <<   n ;           return 0;         } else {           cout <<  Yes                 <<   n ;           cout << 1 <<     << 1 + k <<   n ;           return 0;         }       }       if (h && i - h + 1 <= n - k + 1) {         int st = max(0, i - (n - k + 1)) + 1;         int ed = h;         int nw = st;         while (nw <= ed) {           if (mn1[nw] != -base) {             nw = nxt[find_par(nw)] + 1;           } else {             mn1[nw] = i - nw + 1;             if (nw > 1 && mn1[nw - 1] != -base) dsu(nw, nw - 1);             if (nw < m && mn1[nw + 1] != -base) dsu(nw, nw + 1);             nw++;           }         }       }     }     for (int i = 1; i <= m; i++) {       if (mn[i] + k - 1 < mn1[m - i] && i <= k && m - i <= k) {         cout <<  Yes               <<   n ;         cout << mn[i] <<     << mn1[m - i] <<   n ;         return 0;       }     }     cout <<  No ;     return 0;   }   