func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m, K, bs[500005], hs[500005], ht[500005], ht2[500005], lpos[500005],       rpos[500005], ansl, ansr;   bool flag;   set<int> S;   set<int>::iterator it;   struct node {     int len, id;   } a[500005];   char s[500005], t[500005];   int Hashs(int fr, int to) {     return (-(long long)hs[fr - 1] * bs[to - fr + 1] % 1000000007 + hs[to] +             1000000007) %            1000000007;   }   bool check(int fr, int l) { return ht[l] == Hashs(fr, fr + l - 1); }   bool check2(int to, int l) { return ht2[m - l + 1] == Hashs(to - l + 1, to); }   bool cmp1(const node &lhs, const node &rhs) { return lhs.len > rhs.len; }   int main() {     scanf( %d%d%d , &n, &m, &K);     scanf( %s , s + 1);     scanf( %s , t + 1);     bs[0] = 1;     for (int i = 1; i <= n; ++i) bs[i] = (long long)bs[i - 1] * 8741 % 1000000007;     for (int i = 1; i <= n; ++i)       hs[i] = ((long long)hs[i - 1] * 8741 + s[i]) % 1000000007;     for (int i = 1; i <= m; ++i)       ht[i] = ((long long)ht[i - 1] * 8741 + t[i]) % 1000000007;     for (int i = 1; i <= n; ++i) {       int l = 0, r = min(m, n - i + 1), mid;       while (l < r) {         mid = (l + r + 1) >> 1;         if (check(i, mid))           l = mid;         else           r = mid - 1;       }       a[i] = (node){l, i};     }     sort(a + 1, a + n + 1, cmp1);     S.clear();     int now = 1;     for (int i = m; i >= 1; --i) {       for (; a[now].len == i && now <= n; now++) {         S.insert(a[now].id);       }       if (i == m) {         it = S.lower_bound(1);         if (it != S.end())           lpos[i] = *it;         else           lpos[i] = 1000000000;       } else {         it = S.lower_bound(K - i + 1);         if (it != S.end())           lpos[i] = *it;         else           lpos[i] = 1000000000;       }     }     for (int i = m; i >= 1; --i) {       ht2[i] = (-(long long)ht[i - 1] * bs[m - i + 1] % 1000000007 + ht[m] +                 1000000007) %                1000000007;     }     S.clear();     for (int i = 1; i <= n; ++i) {       int l = 0, r = i, mid;       while (l < r) {         mid = (l + r + 1) >> 1;         if (check2(i, mid))           l = mid;         else           r = mid - 1;       }       a[i] = (node){l, i};     }     sort(a + 1, a + n + 1, cmp1);     now = 1;     for (int i = m; i >= 1; --i) {       for (; a[now].len == i && now <= n; now++) {         S.insert(a[now].id);       }       if (i == m) {         it = S.lower_bound(K);         if (it != S.end())           rpos[i] = *it;         else           rpos[i] = -1000000000;       } else {         it = S.upper_bound(n + i - K);         if (it != S.begin()) {           it--;           rpos[i] = *it;         } else           rpos[i] = -1000000000;       }     }     flag = 0;     for (int i = 1; i < m; ++i) {       int x = lpos[i], y = rpos[m - i];       if (i > K || m - i > K) continue;       if (x + i - 1 <= y - m + i) {         flag = 1;         ansl = x + i - K, ansr = y - m + i + 1;         break;       }     }     if (!flag && m <= K) {       if (max(K, lpos[m] + m - 1) + K <= n) {         flag = 1;         ansl = max(lpos[m] + m - 1, K) - K + 1, ansr = n - K + 1;       }       if (min(n - K + 1, rpos[m] - m + 1) - K >= 1) {         flag = 1;         ansl = 1, ansr = min(n - K + 1, rpos[m] - m + 1);       }     }     if (flag)       printf( Yes n%d %d n , ansl, ansr);     else       printf( No n );     return 0;   }   