Submission #529779

#TimeUsernameProblemLanguageResultExecution timeMemory
529779Alex_tz307JJOOII 2 (JOI20_ho_t2)C++17
100 / 100
136 ms45652 KiB
#include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; const int kN = 2e5; const int kLog = 17; int n, k, nxt[3][1 + kN][1 + kLog], nxt2[3][1 + kN]; string s; void minSelf(int &x, int y) { if (y < x) { x = y; } } void build(int t) { nxt[t][n][0] = n; nxt2[t][n] = n; for (int i = n - 1; i >= 0; --i) { if (i + 1 < n && s[i + 1] - '0' == t) { nxt[t][i][0] = i + 1; } else { nxt[t][i][0] = nxt[t][i + 1][0]; } if (s[i] - '0' == t) { nxt2[t][i] = i; } else { nxt2[t][i] = nxt2[t][i + 1]; } } for (int i = 1; i <= kLog; ++i) { nxt[t][n][i] = n; for (int j = 0; j < n; ++j) { if (nxt[t][j][i - 1] == n) { nxt[t][j][i] = n; } else { nxt[t][j][i] = nxt[t][nxt[t][j][i - 1]][i - 1]; } } } } void lift(int t, int &index) { for (int i = kLog; i >= 0; --i) { if (k & (1 << i)) { index = nxt[t][index][i]; } } } void testCase() { cin >> n >> k >> s; k -= 1; for (int i = 0; i < n; ++i) { if (s[i] == 'J') { s[i] = '0'; } else if (s[i] == 'O') { s[i] = '1'; } else if (s[i] == 'I') { s[i] = '2'; } } for (int i = 0; i < 3; ++i) { build(i); } int ans = INF; for (int i = 0; i < n; ++i) { if (s[i] == '0') { int j = i; for (int p = 0; p < 3; ++p) { lift(p, j); if (p + 1 < 3) { j = nxt2[p + 1][j]; } } if (j < n) { minSelf(ans, j - i + 1 - 3 * (k + 1)); } } } if (ans == INF) { cout << "-1\n"; } else { cout << ans << '\n'; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int tests = 1; for (int tc = 0; tc < tests; ++tc) { testCase(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...