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...