Submission #1206467

#TimeUsernameProblemLanguageResultExecution timeMemory
1206467sabino1Necklace (Subtask 4) (BOI19_necklace4)C++20
0 / 15
192 ms53444 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long int;

vector<vector<int>> pp;

struct info{
    int tam, bs,bt;
    info(int tam_ = -1, int bs_ = -1, int bt_ = -1) : tam(tam_), bs(bs_), bt(bt_){}
    bool operator <(const info & ot)const{return tam < ot.tam;}
};

void get_p(string & s, vector<int> & p){
    p.resize(s.size());
    p[0] = 0;
    for(int i=1; i<s.size(); i++){
        int j = p[i-1];
        while(j != 0 && s[i] != s[j]) j = p[j-1];
        if(s[i] == s[j]) j++;
        p[i] = j;
    }
}

info solve(string & s, string & t){
    info ans(-1,-1,-1);
    for(int i=s.size()-1; i>=0; i--){
        // s + '#' + t
        // n1 + 1 + n2
        int n1 = s.size()-i;
        int n2 = t.size();
        // cout << s.substr(i,n1) << '#' << t << endl;
        for(int j=0; j < n2; j++){
            // s: (i) xxxxx yyyyy
            // t:     yyyyy xxxxx (j)
            // bx = begin_x, mx = mid_x (pela esquerda), ex = end_x
            int id = n1+1+j;
            if(pp[i][id] == 0) continue;
            int tam1 = pp[i][id];
            int bs = i, ms = i+tam1-1;

            int mt = j-tam1+1, et = j;
            
            int i2 = i+tam1, id2 = (j-tam1) + (s.size()-(i+tam1)) + 1;

            // cout << "opa " << i << ' ' << j <<  ' ' << tam1 << ' ' << i+tam1 << ' ' << j-tam1 << endl;
            int tam2 = ((i2 >= pp.size() || id2 < 0 || id2 >= pp[i2].size()) ? 0 : pp[i2][id2]);
            int es = i+tam1+tam2-1;
            int bt = j-tam1-tam2+1;
            // cout << "ans " << tam1+tam2 << ' ' << bs << ' ' << bt << '\n';
            ans = max(ans, info(tam1+tam2, bs, bt));
        }   
    }
    return ans;
}

void test(){
    string s,t;
    cin >> s >> t;
    pp.resize(s.size());
    for(int i=0; i<s.size(); i++){
        string str = s.substr(i,s.size()-i) + "#" + t;
        get_p(str,pp[i]);
    }
    info ans = solve(s,t);
    reverse(s.begin(), s.end());
    for(int i=0; i<s.size(); i++){
        string str = s.substr(i,s.size()-i) + "#" + t;
        get_p(str,pp[i]);
    }
    info inv = solve(s,t);
    inv.bs = abs(int(s.size())-1 - inv.bs);
    inv.bs = inv.bs-inv.tam+1;
    ans = max(ans,inv);
    cout << ans.tam << '\n';
    cout << ans.bs << ' ' << ans.bt << '\n';
}

int32_t main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);
    int ttt_ = 1;
    // cin >> ttt_;
    while(ttt_--) test();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...