Submission #1166419

#TimeUsernameProblemLanguageResultExecution timeMemory
1166419sunflowerNivelle (COCI20_nivelle)C++17
110 / 110
24 ms584 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define MASK(x) (1LL << (x))
#define BIT(x, i) (((x) >> (i)) & 1)
#define SZ(x) ((int) (x).size())
#define ALL(a) (a).begin(), (a).end()
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define FORD(i, a, b) for (int i = (a); i >= (b); --i)
#define debug(x) cerr << "[" << #x << " = " << (x) << "]" << endl

#define left    __left
#define right   __right
#define prev    __prev
#define fi      first
#define se      second

template <class X, class Y>
    bool maximize(X &x, Y y) {
        if (x < y) return x = y, true;
        else return false;
    }

template <class X, class Y>
    bool minimize(X &x, Y y) {
        if (x > y) return x = y, true;
        else return false;
    }

int lenS;
string s;

int cnt[27];

namespace subtask2 {
    bool check() {
        return (lenS <= 2000);
    }

    void solve() {
        s = '*' + s;

        pair <int, int> result = {1, 1};
        pair <int, int> ans = {1, 1}; // num diff / num element;
        FOR(i, 1, lenS) {
            memset(cnt, 0, sizeof(cnt));
            int diff = 0;
            FOR(j, i, lenS) {
                cnt[s[j] - 'a']++;
                if (cnt[s[j] - 'a'] == 1) ++diff;

                if (ans.fi * (j - i + 1) > diff * ans.se) {
                    ans = make_pair(diff, j - i + 1);
                    result = make_pair(i, j);
                }
            }
        }

        cout << result.fi << " " << result.se;
    }
};

namespace subtask5 {
    void solve() {
        s = '*' + s;
        // with each numDiff, find maxLength;

        pair <int, int> result = {1, 1};
        pair <int, int> ans = {1, 1}; // num diff / num element;
        FOR(numDiff, 1, 26) {
            memset(cnt, 0, sizeof(cnt));
            int diff = 0;

            int l = 1, r = 1, len = 0;
            pair <int, int> cur_pos = {-1, -1};
            while (l <= lenS && r <= lenS) {
                cnt[s[r] - 'a']++;
                if (cnt[s[r] - 'a'] == 1) ++diff;
                while (diff > numDiff) {
                    cnt[s[l] - 'a']--;
                    if (cnt[s[l] - 'a'] == 0) --diff;
                    ++l;
                }

                if (diff == numDiff) {
                    if (maximize(len, r - l + 1)) cur_pos = make_pair(l, r);
                }

                ++r;
            }

            if (len == 0) break;

            if (ans.fi * len > numDiff * ans.se) {
                ans = make_pair(numDiff, len);
                result = cur_pos;
            }
        }

        cout << result.fi << " " << result.se;
    }
};

int main() {
    ios_base::sync_with_stdio(false);cin.tie(nullptr);
    cin >> lenS;
    cin >> s;

//    if (subtask2 :: check()) return subtask2 :: solve(), 0;
    subtask5 :: solve();

    return 0;
}

/* Discipline - Calm */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...