結果
問題 |
No.3290 Encrypt Failed, but Decrypt Succeeded
|
ユーザー |
|
提出日時 | 2025-10-03 23:47:34 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 15 ms / 2,000 ms |
コード長 | 3,200 bytes |
コンパイル時間 | 3,047 ms |
コンパイル使用メモリ | 281,328 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-10-03 23:47:39 |
合計ジャッジ時間 | 4,716 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#include <bits/stdc++.h> using namespace std; using i64 = long long; template <class T> using vec = vector<T>; // 多次元配列は vec dp(n1, vec(n2, vec(n3, init_val))) のように書けるよ(型推論) template <class T, class S> inline bool chmax(T &a, const S &b) { return (a < b ? a = b, 1 : 0); } template <class T, class S> inline bool chmin(T &a, const S &b) { return (a > b ? a = b, 1 : 0); } template <class T, class U> std::ostream &operator<<(std::ostream &os, const std::pair<T, U> &pair) { os << "(" << pair.first << ", " << pair.second << ")"; return os; } template <typename... Args> std::ostream &operator<<(std::ostream &os, const std::tuple<Args...> &t) { os << "("; [&]<std::size_t... I>(std::index_sequence<I...>) { ((os << (I == 0 ? "" : ", ") << std::get<I>(t)), ...); }(std::index_sequence_for<Args...>{}); os << ")"; return os; } // `std::ostream << T` が利用可能かどうかをチェック template <typename T, typename = void> struct is_ostream_writable : std::false_type {}; template <typename T> struct is_ostream_writable< T, std::void_t<decltype(std::declval<std::ostream &>() << std::declval<T>())>> : std::true_type {}; template <typename T> constexpr bool is_ostream_writable_v = is_ostream_writable<T>::value; // イテラブルのものを出力できるようにする template <std::ranges::range R> requires(!is_ostream_writable_v<R>) std::ostream &operator<<(std::ostream &os, const R &range) { os << "["; for (auto it = range.begin(); it != range.end(); it++) { os << *it; if (next(it) != range.end()) { os << ", "; } } os << "]"; return os; } template <class T> void debug_var(const char *var_name, const T &a) { cerr << var_name << " = " << a << endl; } #ifdef DEBUG_MODE #define DEBUG_VAR(var) debug_var(#var, var) #else #define DEBUG_VAR(var) #endif #define REP(i, n) for (i64 i = 0; i < (i64)(n); i++) int main() { i64 N, K; cin >> N >> K; K--; string t; cin >> t; if (N == 1) { char ans = 'a' + (t[0] - '0') - 1; cout << ans << endl; return 0; } // [i..n)を復号したときにあり得る数 vec<i64> dp(N + 1, 0); dp[N] = 1; dp[N - 1] = t[N - 1] == '0' ? 0 : 1; for (i64 i = N - 2; i >= 0; i--) { if (t[i] == '1') { dp[i] = dp[i + 1] + dp[i + 2]; } else if (t[i] == '2' && t[i + 1] <= '6') { dp[i] = dp[i + 1] + dp[i + 2]; } else if (t[i] == '0') { dp[i] = 0; } else { dp[i] = dp[i + 1]; } dp[i] = min(dp[i], K + 1); } DEBUG_VAR(dp); string ans; i64 i = 0; while (i < N) { if (i == N - 1) { assert(t[i] >= '1' && t[i] <= '9'); ans += 'a' + (t[i] - '0') - 1; break; } if (K >= dp[i + 1]) { K -= dp[i + 1]; ans += 'a' + stoi(t.substr(i, 2)) - 1; i += 2; } else { assert(t[i] >= '1' && t[i] <= '9'); ans += 'a' + (t[i] - '0') - 1; i += 1; } } cout << ans << endl; }