Submission #1154502

#TimeUsernameProblemLanguageResultExecution timeMemory
1154502misavoNecklace (Subtask 4) (BOI19_necklace4)C++20
0 / 15
137 ms584 KiB
#include <bits/stdc++.h>
// #include <iostream>

#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#define sz(x) int((x).size())
#define all(a) begin(a), end(a)
#define pll pair<long long, long long>
#define vb vector<bool>
#define vll vector<long long>
#define vvll vector<vector<long long> >
#define vpl vector< pair<long long, long long> >
#define f(i,s,e) for(long long int i = s; i < e; i++)
#define cf(i,s,e) for(long long int i = s; i <= e; i++)
#define rf(i,s,e) for(long long int i = s; i >= e; i--)
#define print(a) for(auto x : a) cout << x <<  <<endl;
#define printp(a) for(auto x : a) cout << x.first <<  << x.second <<endl;
#define pb push_back
#define F first
#define S second
using namespace std;
typedef long long ll;
typedef long double ld;

inline ll read() {ll x = 0, fh = 1; char ch = getchar(); while(!isdigit(ch)) {if (ch == '-') fh = -1; ch = getchar();} while (isdigit(ch)) {x = (x << 1) + (x << 3) + ch - '0'; ch = getchar();} return x*fh;}

const ll INF = 1e9;
const ll MOD = 1e9 + 7;

ll t, n, m, k, a, b, tot;
string s1, s2;

void aux(bool rev) {
    f(i, 0, s1.size()) {
        vll temp(s1.size() - i);
        temp[0] = 0;
        ll l = 0, r = 0;
        f(j, 1, temp.size()) {
            if (j < r) temp[j] = min(r - j, temp[j - l]);
            while (j + temp[j] < temp.size() && s1[i + temp[j]] == s1[i + j + temp[j]]) temp[j]++;
            if (j + temp[j] > r) {
                l = j;
                r = j + temp[j];
            }
        }

        vll z(n);
        l = 0; r = 0;
        f(j, 0, n) {
            if (j < r) z[j] = min(r - j, temp[j - l]);
            while (i + z[j] < s1.size() && j + z[j] < n && s1[i + z[j]] == s2[j + z[j]]) z[j]++;
            if (j + z[j] > r) {
                l = j;
                r = j + z[j];
            }
        }

        ll mx = 0;
        f(j, 0, n) mx = max(mx, z[j]);
        if (!mx) continue;

        vll kmp(n);
        kmp[0] = 0;
        f(j, 1, s1.size() - i - mx) {
            ll len = kmp[j-1];
            while (len && s1[len + i + mx] != s1[j]) len = kmp[len-1];
            if (s1[j] == s1[len + i + mx]) len++;
            kmp[j] = len;
        }

        vll lps(n+1);
        lps[0] = 0;
        ll len = 0;
        cf(j, 1, n) {
            if (s1[i+mx+len] == s2[j-1]) len++;
            else {
                if (len > 0) {
                    do {
                        len = kmp[len-1];
                    } while (len > 0 && s1[len+i+mx] != s2[j-1]);
                    if (s1[len+i+mx] == s2[j-1]) len++;
                }
            } lps[j] = len;
        }

        f(j, 0, n) {
            if (z[j] == mx) {
                ll curr = mx + lps[j];
                if (curr > tot) {
                    tot = curr;
                    a = i;
                    if (rev) b = n - (j + mx); 
                    else b = j - lps[j];
                }
            }
        }
    }
}

void solve() {
    cin >> s1 >> s2;
    n = s2.size();

    aux(0);
    reverse(all(s2));
    aux(1);
    cout << tot <<endl;
    cout << a << " " << b <<endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    t = 1;
    while (t--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...