結果

問題 No.3290 Encrypt Failed, but Decrypt Succeeded
ユーザー CoCo_Japan_pan
提出日時 2025-10-03 23:22:47
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 3,041 bytes
コンパイル時間 3,169 ms
コンパイル使用メモリ 281,432 KB
実行使用メモリ 7,720 KB
最終ジャッジ日時 2025-10-03 23:23:02
合計ジャッジ時間 4,678 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 6 WA * 21
権限があれば一括ダウンロードができます

ソースコード

diff #

#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, 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];
        }
    }
    DEBUG_VAR(dp);
    string ans;
    i64 i = 0;
    while (i < N) {
        if (i == N - 1) {
            ans += 'a' + (t[i] - '0') - 1;
            break;
        }
        if (K >= dp[i + 1]) {
            K -= dp[i + 1];
            ans += 'a' + stoi(t.substr(i, 2)) - 1;
            DEBUG_VAR(ans);
            i += 2;
        } else {
            ans += 'a' + (t[i] - '0') - 1;
            i += 1;
        }
    }
    cout << ans << endl;
}
0