結果

問題 No.2893 Minahoshi (Hard)
ユーザー 👑 rin204rin204
提出日時 2024-09-13 22:52:17
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 14 ms / 2,000 ms
コード長 1,808 bytes
コンパイル時間 1,045 ms
コンパイル使用メモリ 81,448 KB
実行使用メモリ 13,500 KB
最終ジャッジ日時 2024-09-13 22:52:21
合計ジャッジ時間 4,183 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 9 ms
6,948 KB
testcase_02 AC 10 ms
11,212 KB
testcase_03 AC 9 ms
12,656 KB
testcase_04 AC 8 ms
9,168 KB
testcase_05 AC 11 ms
10,448 KB
testcase_06 AC 7 ms
6,940 KB
testcase_07 AC 5 ms
6,940 KB
testcase_08 AC 6 ms
6,944 KB
testcase_09 AC 14 ms
13,128 KB
testcase_10 AC 9 ms
7,628 KB
testcase_11 AC 8 ms
7,628 KB
testcase_12 AC 10 ms
7,756 KB
testcase_13 AC 8 ms
9,040 KB
testcase_14 AC 7 ms
8,352 KB
testcase_15 AC 4 ms
6,944 KB
testcase_16 AC 8 ms
9,156 KB
testcase_17 AC 9 ms
11,284 KB
testcase_18 AC 7 ms
9,304 KB
testcase_19 AC 9 ms
7,632 KB
testcase_20 AC 6 ms
8,548 KB
testcase_21 AC 8 ms
9,056 KB
testcase_22 AC 5 ms
6,940 KB
testcase_23 AC 7 ms
9,228 KB
testcase_24 AC 5 ms
6,944 KB
testcase_25 AC 4 ms
6,948 KB
testcase_26 AC 3 ms
7,760 KB
testcase_27 AC 7 ms
6,944 KB
testcase_28 AC 9 ms
7,760 KB
testcase_29 AC 11 ms
8,016 KB
testcase_30 AC 14 ms
13,040 KB
testcase_31 AC 8 ms
11,316 KB
testcase_32 AC 7 ms
8,964 KB
testcase_33 AC 13 ms
13,128 KB
testcase_34 AC 12 ms
10,480 KB
testcase_35 AC 7 ms
8,952 KB
testcase_36 AC 6 ms
9,188 KB
testcase_37 AC 14 ms
13,500 KB
testcase_38 AC 7 ms
9,272 KB
testcase_39 AC 7 ms
9,192 KB
testcase_40 AC 7 ms
9,236 KB
testcase_41 AC 7 ms
9,228 KB
testcase_42 AC 13 ms
10,660 KB
testcase_43 AC 13 ms
12,964 KB
testcase_44 AC 12 ms
12,260 KB
testcase_45 AC 12 ms
10,368 KB
testcase_46 AC 12 ms
12,740 KB
testcase_47 AC 13 ms
12,904 KB
testcase_48 AC 8 ms
9,104 KB
testcase_49 AC 8 ms
7,880 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

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

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

const int o = 1e6;
int n, K, pth[o], cnt, nxt[o];
bool vis[o];
int solve() {
    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);
    for (int i = 0; i <= 2 * n + 10; i++) {
        pth[i] = 0;
        vis[i] = 0;
        nxt[i] = 0;
    }
    K   = 0;
    cnt = 0;

    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