Submission #1305835

#TimeUsernameProblemLanguageResultExecution timeMemory
1305835DanielPr8Necklace (Subtask 1-3) (BOI19_necklace1)C++20
85 / 85
241 ms508 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = int;
using vll = vector<ll>;
using vvl = vector<vll>;
using pll = pair<ll,ll>;
using vpl = vector<pll>;
using vvp = vector<vpl>;

#define f first
#define s second
#define pb push_back
#define all(v) v.begin(), v.end()


void calc(string& s, vll& pi, ll ad){
    pi[ad]=0;
    for(ll j, i=ad+1; i < s.size(); ++i){
        j = pi[i-1]+ad;
        pi[i]=0;
        while(j>=ad){
            if(s[j]==s[i]){
                pi[i]=j-ad+1;
                break;
            }
            if(j==ad)break;
            j=pi[j-1]+ad;
        }
    }
}

pair<ll,pll> solve(string& s, string& t, vll& kmp1, vll& kmp2){
    string st = s+"#"+t;
    string ts = t+"#"+s;
    ll ans=0, m=t.size();
    pll ret={0,0};
    reverse(all(ts));
    for(ll i = 0; i <= s.size(); ++i){
        calc(st, kmp1, i);
        calc(ts, kmp2, s.size()-i);
        for(ll j = -1; j < m; ++j){
            ll cur = kmp1[s.size()+1+j]+kmp2[s.size()+m-j-1];
            if(cur>ans){
                ans=cur;
                ret = {i-kmp2[s.size()+m-j-1],j+1-kmp1[s.size()+1+j]};
            }
        }
    }
    return {ans,ret};
}


int main(){
    ios_base::sync_with_stdio(0);cin.tie(NULL);
    string s, t;
    cin >> s >> t;
    vll kmp1, kmp2;
    kmp1=kmp2=vll(s.size()+t.size()+1);
    pair<ll,pll> ans = solve(s,t,kmp1, kmp2);
    reverse(all(t));
    pair<ll,pll> ans2 = solve(s,t,kmp1, kmp2);
    if(ans.f>ans2.f){
        cout << ans.f << "\n" << ans.s.f << " " << ans.s.s;
    }
    else{
        cout << ans2.f << "\n" << ans2.s.f << " " << t.size()-ans2.s.s-ans2.f;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...