제출 #1357973

#제출 시각아이디문제언어결과실행 시간메모리
1357973avighnaChorus (JOI23_chorus)C++20
0 / 100
220 ms4568 KiB
#include <bits/stdc++.h>

using namespace std;

const int inf = 1e9;

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);

  int n, k;
  string s;
  cin >> n >> k >> s;
  reverse(s.begin(), s.end());

  int u = 0;
  for (int i = 0; i < 2 * n; ++i) {
    u = (u << 1) | (s[i] == 'B');
  }

  vector<int> dist(1 << (2 * n), inf);
  queue<int> q;
  q.push(u);
  dist[u] = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < 2 * n - 1; ++i) {
      int nu = u;
      int b1 = nu & 1 << i;
      int b2 = nu & 1 << (i + 1);
      if (b1) { nu ^= 1 << i; }
      if (b2) { nu ^= 1 << (i + 1); }
      if (b2) { nu ^= 1 << i; }
      if (b1) { nu ^= 1 << (i + 1); }
      if (dist[u] + 1 < dist[nu]) {
        q.push(nu);
        dist[nu] = dist[u] + 1;
      }
    }
  }

  auto good = [&](int mask) {
    vector<int> a, b;
    for (int i = 0; i < 2 * n; ++i) {
      if (mask & 1 << i) {
        b.push_back(i);
      } else {
        a.push_back(i);
      }
    }
    if (a.size() != b.size()) { return false; }
    vector<int> dp(n, inf);
    dp[0] = 1;
    for (int i = 1; i < n; ++i) {
      if (a[i] < b[0]) {
        dp[i] = 1;
      }
      for (int j = i - 1; j >= 0; --j) {
        if (a[i] < b[j + 1]) {
          dp[i] = min(dp[i], 1 + dp[j]);
        }
      }
    }
    return k >= dp[n - 1];
  };

  int ans = inf;
  for (int mask = 0; mask < 1 << (2 * n); ++mask) {
    if (good(mask)) {
      ans = min(ans, dist[mask]);
    }
  }
  cout << ans << '\n';
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…