結果

問題 No.2893 Minahoshi (Hard)
ユーザー 👑 rin204rin204
提出日時 2024-09-13 22:49:00
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
RE  
実行時間 -
コード長 3,538 bytes
コンパイル時間 915 ms
コンパイル使用メモリ 82,216 KB
実行使用メモリ 14,612 KB
最終ジャッジ日時 2024-09-13 22:49:09
合計ジャッジ時間 7,333 ms
ジャッジサーバーID
(参考情報)
judge6 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
6,816 KB
testcase_01 RE -
testcase_02 WA -
testcase_03 AC 10 ms
8,192 KB
testcase_04 AC 8 ms
8,016 KB
testcase_05 AC 12 ms
10,580 KB
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 AC 14 ms
11,932 KB
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 WA -
testcase_28 WA -
testcase_29 WA -
testcase_30 AC 14 ms
12,064 KB
testcase_31 AC 8 ms
9,756 KB
testcase_32 AC 8 ms
8,272 KB
testcase_33 AC 13 ms
14,028 KB
testcase_34 AC 14 ms
14,612 KB
testcase_35 AC 8 ms
8,012 KB
testcase_36 AC 7 ms
8,016 KB
testcase_37 AC 15 ms
14,448 KB
testcase_38 AC 8 ms
9,896 KB
testcase_39 AC 8 ms
9,844 KB
testcase_40 AC 8 ms
8,148 KB
testcase_41 AC 7 ms
8,012 KB
testcase_42 AC 13 ms
11,852 KB
testcase_43 AC 13 ms
11,976 KB
testcase_44 AC 13 ms
14,192 KB
testcase_45 AC 13 ms
10,580 KB
testcase_46 AC 14 ms
11,860 KB
testcase_47 AC 13 ms
10,704 KB
testcase_48 AC 8 ms
9,860 KB
testcase_49 AC 8 ms
10,188 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// https://qoj.ac/submission/74195

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

int solve() {
    const int o = 1e6;
    int n, K, pth[o], cnt, nxt[o];
    bool vis[o];
    auto dfs = [&](auto &&self, int nw) -> void {
        if (vis[nw]) return;
        vis[nw] = 1;
        self(self, nw * 2 % (1 << K));
        self(self, (nw * 2 + 1) % (1 << K));
        pth[++cnt] = nw;
    };

    scanf("%d", &n);
    if (n == 1) {
        putchar(97);
        return 0;
    }
    for (; (1 << K) + K - 1 <= n; ++K);
    --K;
    dfs(dfs, 0);
    for (int i = 1, j = cnt; i < j; swap(pth[i++], pth[j--]));
    if (n == (1 << K) + K - 1) {
        for (int i = 1; i < K; ++i) putchar(97);
        for (int i = 1; i <= cnt; ++i) putchar(97 + pth[i] % 2);
        return 0;
    }
    for (int i = 0; i < (1 << (K + 1)); ++i) vis[i] = 0, nxt[i] = -1;
    for (int i = 1; i <= cnt; ++i) vis[pth[i] = (pth[i] << 1) | (pth[i + 1] & 1)] = 1;
    for (int i = 1; i <= cnt; ++i) nxt[pth[i]] = pth[i % cnt + 1];
    for (int i = 0; i < (1 << (K + 1)); ++i)
        if (nxt[i] < 0) nxt[i] = nxt[i ^ (1 << K)] ^ 1;
    for (int i = 0, t; i < (1 << (K + 1)); ++i)
        if (!vis[i]) {
            for (t = i; !vis[t]; t = nxt[t]) vis[t] = 1, ++cnt;
            swap(nxt[i], nxt[i ^ (1 << K)]);
            if (cnt + K >= n) {
                for (int j = K; j + 1; --j) putchar(97 + ((nxt[i] >> j) & 1));
                for (int j = K + 2, t = nxt[nxt[i]]; j <= n; ++j, t = nxt[t]) putchar(97 + (t & 1));
                break;
            }
        }
    return 0;
}
int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
        cout << endl;
    }
    return 0;
}

// // https://qoj.ac/submission/74195
//
// #include <cstdio>
// #include <iostream>
// using namespace std;
//
// int solve() {
//     const int o = 1e6;
//     int n, K, pth[o], cnt, nxt[o];
//     bool vis[o];
//     auto dfs = [&](auto &&self, int nw) -> void {
//         if (vis[nw]) return;
//         vis[nw] = 1;
//         self(self, nw * 2 % (1 << K));
//         self(self, (nw * 2 + 1) % (1 << K));
//         pth[++cnt] = nw;
//     };
//
//     scanf("%d", &n);
//     if (n == 1) {
//         putchar(97);
//         return 0;
//     }
//     for (; (1 << K) + K - 1 <= n; ++K);
//     --K;
//     dfs(dfs, 0);
//     for (int i = 1, j = cnt; i < j; swap(pth[i++], pth[j--]));
//     if (n == (1 << K) + K - 1) {
//         for (int i = 1; i < K; ++i) putchar(97);
//         for (int i = 1; i <= cnt; ++i) putchar(97 + pth[i] % 2);
//         return 0;
//     }
//     for (int i = 0; i < (1 << (K + 1)); ++i) vis[i] = 0, nxt[i] = -1;
//     for (int i = 1; i <= cnt; ++i) vis[pth[i] = (pth[i] << 1) | (pth[i + 1] & 1)] = 1;
//     for (int i = 1; i <= cnt; ++i) nxt[pth[i]] = pth[i % cnt + 1];
//     for (int i = 0; i < (1 << (K + 1)); ++i)
//         if (nxt[i] < 0) nxt[i] = nxt[i ^ (1 << K)] ^ 1;
//     for (int i = 0, t; i < (1 << (K + 1)); ++i)
//         if (!vis[i]) {
//             for (t = i; !vis[t]; t = nxt[t]) vis[t] = 1, ++cnt;
//             swap(nxt[i], nxt[i ^ (1 << K)]);
//             if (cnt + K >= n) {
//                 for (int j = K; j + 1; --j) putchar(97 + ((nxt[i] >> j) & 1));
//                 for (int j = K + 2, t = nxt[nxt[i]]; j <= n; ++j, t = nxt[t]) putchar(97 + (t &
//                 1)); break;
//             }
//         }
//     return 0;
// }
// int main() {
//     int t;
//     cin >> t;
//     while (t--) {
//         solve();
//         cout << endl;
//     }
//     return 0;
// }
0