제출 #150115

#제출 시각아이디문제언어결과실행 시간메모리
150115이 대회 미분 되나요? (#200)HicCup (FXCUP4_hiccup)C++17
100 / 100
85 ms8192 KiB
#include "hiccup.h"
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int N;
string s;
int lv[1000101];

bool f(int K)
{
	vector<pair<int, int> > v;
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] == 'C')
		{
			while (!v.empty() && v.back().first > lv[i])
				return false;
			v.push_back({ lv[i], 0 });
			while (!v.empty() && v.back().second >= K) v.pop_back();
		}
		else if (s[i] == '!')
		{
			if (!v.empty()) v.back().second++;
			while (!v.empty() && v.back().second >= K) v.pop_back();
		}
	}
	while (!v.empty())
	{
		if (v.back().second < K) return false;
		v.pop_back();
	}
	return true;
}

int HicCup(std::string S) {
	vector<int> v;
	N = S.size();
	s = S;
	int cnt = 0;
	for (int i = 0; i < N; i++)
	{
		if (S[i] == 'H')
		{
			v.push_back(cnt);
			cnt++;
		}
		else if (S[i] == 'C')
		{
			if (!v.empty())
			{
				lv[i] = v.back();
				v.pop_back();
			}
			cnt--;
		}
		else
		{
			if (i == 0 || S[i - 1] == 'H') return -1;
		}

		if (cnt < 0) return -1;
	}
	if (cnt > 0) return -1;

	int lo = 0, hi = 1000001;
	for (int i = 0; i < 21; i++)
	{
		int mid = lo + hi >> 1;
		if (f(mid)) lo = mid;
		else hi = mid;
	}
	return lo;
}

컴파일 시 표준 에러 (stderr) 메시지

hiccup.cpp: In function 'bool f(int)':
hiccup.cpp:14:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < s.size(); i++)
                  ~~^~~~~~~~~~
hiccup.cpp: In function 'int HicCup(std::__cxx11::string)':
hiccup.cpp:70:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int mid = lo + hi >> 1;
             ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...