# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
556535 | alextodoran | JJOOII 2 (JOI20_ho_t2) | C++17 | 7 ms | 2372 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/**
____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|
**/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N_MAX = 200000;
int N, K;
string S;
int first[CHAR_MAX];
int nxt[N_MAX];
deque <int> dq[CHAR_MAX];
bool fix (char c, int pref) {
while (dq[c].empty() == false && dq[c].front() <= pref) {
dq[c].push_back(nxt[dq[c].back()]);
dq[c].pop_front();
}
return (dq[c].back() != N);
}
int main () {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N >> K;
cin >> S;
first['J'] = first['O'] = first['I'] = N;
nxt[N] = N;
for (int i = N - 1; i >= 0; i--) {
nxt[i] = first[S[i]];
first[S[i]] = i;
}
for (int i = 0; i < N; i++) {
if ((int) dq['J'].size() < K) {
if (S[i] == 'J') {
dq['J'].push_back(i);
}
} else if ((int) dq['O'].size() < K) {
if (S[i] == 'O') {
dq['O'].push_back(i);
}
} else if ((int) dq['I'].size() < K) {
if (S[i] == 'I') {
dq['I'].push_back(i);
}
}
}
if ((int) dq['I'].size() < K) {
cout << -1 << "\n";
return 0;
}
int maxDel = 0;
for (int pref = 0; pref < N; pref++) {
maxDel = max(maxDel, pref + (N - 1) - dq['I'].back());
if (S[pref] == 'J') {
if (fix('J', pref) == false) {
break;
}
if (fix('O', dq['J'].back()) == false) {
break;
}
if (fix('I', dq['O'].back()) == false) {
break;
}
}
}
cout << N - K * 3 - maxDel << "\n";
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |