Submission #1276947

#TimeUsernameProblemLanguageResultExecution timeMemory
1276947ThunnusNecklace (Subtask 1-3) (BOI19_necklace1)C++20
0 / 85
0 ms332 KiB
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
#define int i64
#define  vi vector<int>
#define vvi vector<vi>
#define vb vector<bool>
#define pii pair<int, int>
#define fi first
#define se second
#define sz(x) (int)(x).size()                      

inline void solve(){
    string s, t;
    cin >> s >> t;

    bool reversed = false;
    vi lps1(max(sz(s), sz(t)) + 1), lps2(max(sz(s), sz(t)) + 1);
    auto kmp = [&](string s, vi &lps) -> void {
        for(int i = 1; i < sz(s); i++){
            int len = lps[i - 1];
            while(len > 0 && s[i] != s[len]){
                len = lps[len - 1];
            }
            if(s[i] == s[len]){
                len++;
            }
            lps[i] = len;
        }
        return;
    };

    auto calc = [&](string s, string t) -> array<int, 3> {
        int n = sz(s), m = sz(t);
        array<int, 3> ans = {0, 0, 0};
        for(int i = 0; i < n; i++){
            string s1 = s.substr(0, i), s2 = s.substr(i, n - i), t1 = t, t2 = t;
            reverse(s1.begin(), s1.end()), reverse(t2.begin(), t2.end());
            kmp(s1 + '#' + t1, lps1), kmp(s2 + '#' + t2, lps2);
            for(int j = 1; j <= m; j++){
                ans = max(ans, array<int, 3>{lps1[i + j] + lps2[n - i + m - j], i - lps1[i + j], reversed ? m - j - lps2[n - i + m - j] : j - lps1[i + j]});
            }
        }
        return ans;
    };
    array<int, 3> ans = calc(s, t);
    reverse(t.begin(), t.end());
    reversed = true;
    ans = max(ans, calc(s, t));
    cout << ans[0] << "\n" << ans[1] << " " << ans[2] << "\n";
    return;
}

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