Submission #1259090

#TimeUsernameProblemLanguageResultExecution timeMemory
1259090newsboyNecklace (Subtask 4) (BOI19_necklace4)C++20
0 / 15
208 ms106272 KiB
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <set>
#include <map>
#include <numeric>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <climits>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#include <tuple>
#include <cassert>
#include <array>
#include <list>
#include <random>
#include <initializer_list>
#include <chrono>
using namespace std;
using i64 = long long;
using u64 = unsigned long long;

vector<i64> prefixFunction(string s) {
    i64 n = s.size();
    vector<i64> pi(n);
    for (i64 i = 1; i < n; i++) {
        i64 j = pi[i - 1];
        while (j > 0 && s[i] != s[j]) {
            j = pi[j - 1];
        }
        if (s[i] == s[j]) {
            j++;
        }
        pi[i] = j;
    }
    return pi;
}

struct T {
    i64 ans, ls, lt;
};

T work(string s, string t, i64 o) {
    i64 n = s.size();
    i64 m = t.size();
    auto g = s + "?" + t;
    vector<vector<i64>> pi(n);
    for (i64 i = 0; i < n; i++) {
        pi[i] = prefixFunction(g.substr(i));
    }
    i64 ans = 0;
    i64 ls = -1, lt = -1;
    for (i64 i = 0; i < n; i++) {
        for (i64 j = 0; j < m; j++) {
            i64 x = pi[i][n - i + 1 + j];
            if (x > ans) {
                ans = x;
                ls = i;
                lt = j - x + 1;
            }
            if (i + x < n && n - (i + x) + 1 + (j - x) < pi[i].size()) {
                i64 y = pi[i + x][n - (i + x) + 1 + (j - x)];
                if (x + y > ans) {
                    ans = x + y;
                    ls = i;
                    lt = (j - x) - y + 1;
                }
            }
        }
    }
    return {ans, (o ? n - (ls + ans - 1) - 1 : ls), lt};
}

void solve() {
    string s, t;
    cin >> s >> t;
    T res1 = work(s, t, 0);
    reverse(s.begin(), s.end());
    T res2 = work(s, t, 1);
    if (res2.ans > res1.ans) {
        res1 = res2;
    }
    cout << res1.ans << '\n';
    cout << res1.ls << " " << res1.lt << '\n';
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    //cin >> t;
    while (t--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...