func_code_string: #include <bits/stdc++.h>   using namespace std;   inline long long mod(long long n, long long m) {     long long ret = n % m;     if (ret < 0) ret += m;     return ret;   }   long long gcd(long long a, long long b) {     return (b == 0LL ? a : gcd(b, a % b));   }   long long exp(long long a, long long b, long long m) {     if (b == 0LL) return 1LL;     if (b == 1LL) return mod(a, m);     long long k = mod(exp(a, b / 2, m), m);     if (b & 1LL) {       return mod(a * mod(k * k, m), m);     } else       return mod(k * k, m);   }   vector<int> z_function(string s) {     int n = s.size();     vector<int> z(n);     int L = 0, R = 0;     for (int i = 1; i < n; i++) {       if (i <= R) {         if (i - L + z[i - L] > i - L + (R - i)) {           z[i] = R - i + 1;           while (i + z[i] < n and s[z[i]] == s[z[i] + i]) {             z[i]++;           }         } else           z[i] = z[i - L];       } else {         while (i + z[i] < n and s[z[i]] == s[z[i] + i]) {           z[i]++;         }       }       if (i + z[i] - 1 > R) {         L = i, R = i + z[i] - 1;       }     }     return z;   }   const int N = 1000100;   int n, m, k;   vector<int> order[N];   vector<int> get(string s, string t) {     string aux = t +  #  + s;     vector<int> z = z_function(aux);     for (int i = 0; i < N; i++) order[i].clear();     for (int i = 0; i < n; i++) {       if (z[i + m + 1] > 0) order[z[i + m + 1]].push_back(i);     }     set<int> best;     vector<int> res((int)s.size() + 10, -1);     for (int x = m; x > 0; x--) {       for (int id : order[x]) {         best.insert(id);       }       auto it = best.lower_bound(k - x);       if (it == best.end()) continue;       res[x] = *it;     }     return res;   }   vector<int> lpos, rpos;   int32_t main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     ;     cin >> n >> m >> k;     string s, t;     cin >> s >> t;     string aux = t +  #  + s;     vector<int> z = z_function(aux);     for (int i = 0; i < n; i++) {       if (z[i + 1 + m] >= m) {         cout <<  Yes               <<   n ;         int l = min(i + 1, n - 2 * k + 1);         int r = l + k;         cout << l <<     << r <<   n ;         return 0;       }     }     lpos = get(s, t);     reverse(s.begin(), s.end());     reverse(t.begin(), t.end());     rpos = get(s, t);     for (int i = 1; i <= min(m - 1, k); i++) {       if (m - i > k) continue;       int id1 = lpos[i], id2 = rpos[m - i];       if (id1 == -1 or id2 == -1) continue;       int L = lpos[i] + i - 1, R = rpos[m - i] + (m - i) - 1;       if (L + R >= n - 1) continue;       id1 = lpos[i] + i - (k - 1);       id2 = n - rpos[m - i] - (m - i) + 1;       if (id1 + k - 1 < id2 and id2 + k - 1 <= n) {         cout <<  Yes               <<   n ;         cout << id1 <<     << id2 <<   n ;         return 0;       }     }     cout <<  No           <<   n ;   }   