Submission #1224155

#TimeUsernameProblemLanguageResultExecution timeMemory
1224155omsincoconutOlympiads (BOI19_olympiads)C++17
0 / 100
0 ms324 KiB
#include <iostream>
#include <string.h>
#include <algorithm>
#include <unordered_map>

using namespace std;
typedef long long ll;

const int MAXN = 3e3+5;

const ll MOD = 1e9+7, BASE = 97, INV = 268041239;

ll pw[MAXN], invpw[MAXN];

void init() {
    pw[0] = invpw[0] = 1;
    for (int i = 1; i < MAXN; i++) {
        pw[i] = (pw[i-1]*BASE)%MOD;
        invpw[i] = (invpw[i-1]*INV)%MOD;
    }
}

pair<int, int> check(string &s, string &t, int k) {
    int n = s.size()-2, m = t.size()-2;

    ll sq[n+1], tq[m+1];
    sq[0] = tq[0] = 0;

    for (int i = 1; i <= n; i++) {
        sq[i] = (sq[i-1] + pw[i]*(s[i]-'a'))%MOD;
    }

    for (int i = 1; i <= m; i++) {
        tq[i] = (tq[i-1] + pw[i]*(t[i]-'a'))%MOD;
    }

    unordered_map<ll, int> dt;
    for (int i = 0; i+k <= n; i++) {
        ll val = (sq[i+k]-sq[i]+MOD)%MOD*invpw[i+1]%MOD;
        dt[val] = i;
    }

    for (int i = 0; i+k <= m; i++) {
        ll val = (tq[i+k]-tq[i]+MOD)%MOD*invpw[i+1]%MOD;
        for (int j = 1; j <= k; j++) {
            if (dt.count(val)) return {dt[val], i};
            val = (val-(t[i+j]-'a')+MOD)%MOD;
            val = (val*invpw[1])%MOD;
            val = (val+pw[k-1]*(t[i+j]-'a'))%MOD;
        }
    }

    return {-1, -1};
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    init();

    string s, t;
    cin >> s >> t;
    s = '.'+s+'.';
    t = '.'+t+'.';

    int l = 0, r = min(s.size()-1, t.size()-1);
    pair<int, int> ans[min(s.size(), t.size())];
    while (r-l > 1) {
        int mid = (l+r)>>1;
        pair<int, int> check1 = check(s, t, mid);
        reverse(t.begin(), t.end());
        pair<int, int> check2 = check(s, t, mid);
        reverse(t.begin(), t.end());
        if (check1 != make_pair(-1, -1)) {
            l = mid;
            ans[l] = check1;
        } else if (check2 != make_pair(-1, -1)) {
            l = mid;
            ans[l] = make_pair(check2.first, t.size()-check2.second-l-2);
        }
        else r = mid;
    }

    cout << l << '\n' << ans[l].first << ' ' << ans[l].second;

    return 0;
}

/*
zxyabcd
yxbadctz
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...