結果
| 問題 |
No.3290 Encrypt Failed, but Decrypt Succeeded
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-03 23:43:26 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,162 bytes |
| コンパイル時間 | 3,278 ms |
| コンパイル使用メモリ | 281,520 KB |
| 実行使用メモリ | 7,720 KB |
| 最終ジャッジ日時 | 2025-10-03 23:43:31 |
| 合計ジャッジ時間 | 4,367 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 WA * 1 |
ソースコード
#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;
for (i64 i = N - 1; 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[1]);
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;
}