Submission #1164383

#TimeUsernameProblemLanguageResultExecution timeMemory
1164383akzytrDifference (POI11_roz)C++20
10 / 100
77 ms2304 KiB
#include <bits/stdc++.h>
#define ve vector
#define ar array 
#define pb push_back
#define ins insert

#define endl '\n'
#define ll long long
using namespace std;

/*
Segment tree over most and least occuring character and subtract the least prefix that contains both using a pointer of last occurance.
Don't even need seg tree just keep pointer updates of min sum at each point of least character
*/
int main(){
    
    int N;
    string s;
    cin >> N >> s;

    int mx = 0;

    int mdx[N];
    int cnt[26];
    int rm[26];
    int p[26];
    for(char a = 'a'; a <= 'z'; a++){
        for(int i = 0; i < 26; i++){
            cnt[i] = 0;
            rm[i] = 0;
            p[i] = -1;
        }

        for(int i = 0; i < N; i++){
            if(s[i] == a){
                for(int j = 0; j < 26; j++){
                    cnt[j]++;
                    if(p[j] == -1) continue;
                    mx = max(mx, cnt[j] - rm[j]);
                }
            }
            else{
                rm[s[i]-'a'] = min(rm[s[i]-'a'], cnt[s[i]-'a']);
                cnt[s[i]-'a']--;
                p[s[i]-'a'] = i;
                mx = max(mx, cnt[s[i]-'a']);
            }
        }
    }
    cout << mx << endl;
}
#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...
#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...