제출 #1246481

#제출 시각아이디문제언어결과실행 시간메모리
1246481nguyenhuythachJOIOJI (JOI14_joioji)C++20
100 / 100
36 ms11220 KiB
#include<bits/stdc++.h>
#include<algorithm>
#include<random>
#include<chrono>
#include<cstdlib>
#include<ctime>
#include<numeric>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<iomanip>
#define int long long
#define ll long long
#define L LLONG_MAX
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<long long,long long>
#define sz(a) ((int)a.size())
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define REP(i,k,j) for(int i=k;i>=j;i--)
#define FORD(i,a) for(auto i:a)
#define MASK(i) ((1)<<(i))
#define rngdcl mt19937_64 rng(chrono::steady_clock::now().time_asince_epoch().count())
#define random(l,r) ((l)+(rng()%(r-l+1)))
using namespace std;
const int nmax=2e5+1;
int n;
string s;
int J[nmax],O[nmax],I[nmax];
map<pair<pair<int,int>,int>,int> m;

void input()
{
    cin >> n >> s;
}

void sub1()
{
    s='0'+s;
    int ans=0;
    FOR(i,1,n-1) FOR(j,i+1,n)
    {
        int a=0,b=0,c=0;
        FOR(k,i,j)
        {
            if(s[k]=='J') a++;
            if(s[k]=='O') b++;
            if(s[k]=='I') c++;
        }
        if(a==b && b==c) ans=max(ans,(j-i+1));
    }
    cout << ans;
}

void sub2()
{
    int ans=0;
    FOR(i,0,sz(s)-1)
    {
        if(i!=0)
        {
            J[i]+=J[i-1];
            O[i]+=O[i-1];
            I[i]+=I[i-1];
        }
        if(s[i]=='J') J[i]++;
        if(s[i]=='O') O[i]++;
        if(s[i]=='I') I[i]++;
        int mn=min({J[i],O[i],I[i]});
        
        if(m.count({{J[i]-mn,O[i]-mn},I[i]-mn})) ans=max(ans,mn-m[{{J[i]-mn,O[i]-mn},I[i]-mn}]);
        else m[{{J[i]-mn,O[i]-mn},I[i]-mn}]=mn;
    }
    if(m.count({{0,0},0})) ans=max(ans,m[{{0,0},0}]);
    cout << ans*3;
}

signed main()
{
    //freopen(".inp", "r", stdin);
    //freopen(".out", "w", stdout);
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    input();
    if(n<=200) sub1();
    else sub2();
}



#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...