제출 #150714

#제출 시각아이디문제언어결과실행 시간메모리
150714usa1+samsung2 (#200)HicCup (FXCUP4_hiccup)C++17
24 / 100
32 ms5492 KiB
#include "hiccup.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool pred(const vector<int>& v, const int& g) {
    int rem = 0;
    for(int i=0; i<(int)v.size(); i++){
        if(v[i] >= g) {
            rem += v[i]-g;
        } else if ((v[i]+rem) >= g) {
            rem += v[i]+rem-g;
        } else return false;
    }
    return true;
}

int HicCup(std::string S) {
	int N = S.size();
        int x = 0;
        int lo = 0;
        int hi = 0;
        int ans = 0;
        vector<int> v;
        if (N==0) return 0;
        if (S[0] != 'H') return -1;

        {
            int cur = 0;
            char ex = S[0];
            for(int i = 1 ; i < N;i++) {
                const char &s = S[i];
                if((s != 'H') && (s!='C') && (s!='!')){
                    return -1;
                }
                switch(ex) {
                    case 'H':
                        if(s=='H') {
                            cur++;
                        } else if(s=='!') {
                            return -1;
                        }
                        break;
                    case 'C':
                        if(s=='C') cur--;
                        break;
                    case '!':
                        break;
                    default:
                        return -1;
                        break;
                }
                if(cur<0) return -1;
                if(s!='!')ex = s;
            }
            if(ex=='H' || cur != 0) return -1;
        }
        for(int i=N-1;i>=0;i--) {
            if(S[i] == '!') x++;
            else if(S[i] == 'C') {
                v.push_back(x);
                hi = max(hi, x);
                x=0;
            }
        }
        {
            int mid;
            while(lo<=hi){
                mid = (lo+hi)/2;
                if(pred(v, mid)) {
                    ans = max(ans, mid);
                    lo = mid + 1;
                } else {
                    hi = mid - 1;
                }
            }
        }
        return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...