Submission #1305745

#TimeUsernameProblemLanguageResultExecution timeMemory
1305745rodriiiNecklace (Subtask 4) (BOI19_necklace4)C++20
0 / 15
204 ms596 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long

const int MXN = 500005;

vector<int> prefix_function(string s){
    //cout << s << "\n";
    int n = s.size();
    vector<int> pi(n);
    for(int i = 1; i < n; ++i){
        int j = pi[i-1];
        while(j > 0 && s[j] != s[i]){
            j = pi[j-1];
        }
        if(s[i] == s[j]) j++;
        pi[i] = j;
    }
    return pi;
}

int ans = 0, ini_a, ini_b;
string s, t, revt;

vector<int> left_part(string &leftS){
    reverse(leftS.begin(), leftS.end());
    vector<int> kmp = prefix_function(leftS + '?' + revt);
    reverse(kmp.begin() + (int)leftS.size() + 1, kmp.end());
    return kmp;
}

vector<int> right_part(string &rightS){
    vector<int> kmp = prefix_function(rightS + '?' + t);
    return kmp;
}

void process(bool invertido){
    for(int i = 0; i < s.size(); ++i){
        string leftS = s.substr(0, i + 1);
        string rightS = s.substr(i + 1);
        //cout << leftS << " " << rightS << "\n";
        vector<int> a = left_part(leftS), b = right_part(rightS);
        a.emplace_back(0);
        int j = leftS.size() + 1, k = rightS.size() + 1;
        for(int r = 0; r < t.size(); ++r){
            //cout << r << " " << a[j] << " " << b[k] << "\n";
            int len = a[j + 1] + b[k];
            if(len > ans){
                ans = len;
                ini_a = i - a[j + 1] + 1;
                if(invertido) ini_b = t.size() - 1 - r - b[k];
                else ini_b = r - b[k];
            }
            j++; k++;
        }
    }
}

void solve(){
    cin >> s >> t;
    revt = t;
    reverse(t.begin(), t.end());
    swap(t, revt);
    //cout << t << " " << revt << "\n";
    process(false);
    swap(revt, t);
    process(true);
    //process();
    cout << ans << "\n";
    cout << ini_a << " " << ini_b << "\n";
}

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