結果

問題 No.291 黒い文字列
コンテスト
ユーザー yuppe19 😺
提出日時 2015-10-17 07:56:37
言語 C++11(old_compat)
(gcc 12.4.0 + boost 1.89.0)
コンパイル:
g++-12 -O2 -lm -std=gnu++11 -Wuninitialized -DONLINE_JUDGE -include bits/stdc++.h -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 122 ms / 2,000 ms
コード長 1,800 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,394 ms
コンパイル使用メモリ 180,724 KB
実行使用メモリ 65,024 KB
最終ジャッジ日時 2026-03-08 16:03:53
合計ジャッジ時間 3,869 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 26
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <iostream>
#include <algorithm>
using namespace std;

class range {private: struct I{int x;int operator*(){return x;}bool operator!=(I& lhs){return x<lhs.x;}void operator++(){++x;}};I i,n;
public:range(int n):i({0}),n({n}){}range(int i,int n):i({i}),n({n}){}I& begin(){return i;}I& end(){return n;}};

template <class T> void choose_max(T &a, T b) { a = max(a, b); }

int main(void) {
  string s; cin >> s;
  int n = s.size();
  vector<vector<vector<vector<vector<char>>>>> dp(n+1, vector<vector<vector<vector<char>>>>(22, vector<vector<vector<char>>>(22, vector<vector<char>>(22, vector<char>(22)))));
  dp[0][0][0][0][0] = 1;
  for(int i : range(n)) {
    for(int ck : range(21)) {
      for(int cu : range(ck+1)) {
        for(int cr : range(cu+1)) {
          for(int co : range(cr+1)) {
            if(!dp[i][ck][cu][cr][co]) { continue; }
            char c = s[i];
            bool joker = c == '?';
            choose_max(dp[i+1][ck+(c=='K'||joker)][cu][cr][co], dp[i][ck][cu][cr][co]);
            choose_max(dp[i+1][ck][cu+(c=='U'||joker)][cr][co], dp[i][ck][cu][cr][co]);
            choose_max(dp[i+1][ck][cu][cr+(c=='R'||joker)][co], dp[i][ck][cu][cr][co]);
            choose_max(dp[i+1][ck][cu][cr][co+(c=='O'||joker)], dp[i][ck][cu][cr][co]);
            if((c == 'I'||joker) && ck && cu && cr && co) {
              choose_max(dp[i+1][ck-1][cu-1][cr-1][co-1], char(dp[i][ck][cu][cr][co] + 1));
            }
          }
        }
      }
    }
  }
  char res = 0;
  for(int i : range(n+1)) {
    for(int ck : range(21)) {
      for(int cu : range(ck+1)) {
        for(int cr : range(cu+1)) {
          for(int co : range(cr+1)) {
            choose_max(res, char(dp[i][ck][cu][cr][co] - 1));
          }
        }
      }
    }
  }
  printf("%d\n", int(res));
  return 0;
}
0