Submission #1348436

#TimeUsernameProblemLanguageResultExecution timeMemory
1348436k1r1t0Casino (JOI26_casino)C++20
0 / 100
0 ms760 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 8;

int to[1 << N], from[1 << N];

void init() {
    int cnt = 0;
    for (int i = 0; i < (1 << N); i++) {
        int cur = 0;
        for (int j = 1; j < N; j += 2)
            if (i & (1 << j))
                cur ^= 1;
        if (cur == 1) {
            from[i] = -1;
            continue;
        }
        to[cnt] = i;
        from[i] = cnt++;
    }
}

vector<vector<int>> Azzurro(int N, int L, string S) {
    if (L > 40) return {};
    while (L < 51) {
        S.push_back('A');
        L++;
    }
    vector<vector<int>> v(N, vector<int>(N, 0));
    v[0][0] = S[0] - 'A';
    v[7][7] = S[50] - 'A';
    init();
    int ptr = 1;
    for (int s = 1; s <= 13; s++) {
        int len = (s <= 7 ? s + 1 : 15 - s);
        int msk = 0;
        for (int i = 0; i < len - 1; i++)
            msk |= ((S[ptr + i] - 'A') << i);
        msk = to[msk];
        for (int i = 0; i < 8; i++) {
            int j = s - i;
            if (j < 0 || j > 7) continue;
            v[i][j] = (msk & 1);
            msk >>= 1;
        }
        ptr += len - 1;
    }
    return v;
}

string Bordeaux(int N, int L, vector<vector<int>> v) {
    init();
    string S;
    S.push_back((v[0][0] ^ 1) + 'A');
    int x = 0, y = 0;
    for (int s = 1; s <= 13; s++) {
        int len = (s <= 7 ? s + 1 : 15 - s);
        int x1 = x + 1, y1 = y;
        int x2 = x, y2 = y + 1;
        int msk1 = 0, msk2 = 0;
        for (int i = 7; i >= 0; i--) {
            int j = s - i;
            if (j < 0 || j > 7) continue;
            msk1 <<= 1;
            msk1 |= (v[i][j] ^ (x1 == i && y1 == j));
            msk2 <<= 1;
            msk2 |= (v[i][j] ^ (x2 == i && y2 == j));
        }
        int msk = 0;
        if (from[msk1] != -1 && 0 <= x1 && x1 <= 7 && 0 <= y1 && y1 <= 7) {
            msk = msk1;
            x = x1;
            y = y1;
        }
        if (from[msk2] != -1 && 0 <= x2 && x2 <= 7 && 0 <= y2 && y2 <= 7) {
            msk = msk2;
            x = x2;
            y = y2;
        }
        msk = from[msk];
        for (int i = 0; i < len - 1; i++)
            S.push_back(((msk >> i) & 1) + 'A');
    }
    S.push_back((v[7][7] ^ 1) + 'A');
    while ((int) S.size() > L)
        S.pop_back();
    return S;
}
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 8;

int to[1 << N], from[1 << N];

void init() {
    int cnt = 0;
    for (int i = 0; i < (1 << N); i++) {
        int cur = 0;
        for (int j = 1; j < N; j += 2)
            if (i & (1 << j))
                cur ^= 1;
        if (cur == 1) {
            from[i] = -1;
            continue;
        }
        to[cnt] = i;
        from[i] = cnt++;
    }
}

vector<vector<int>> Azzurro(int N, int L, string S) {
    if (L > 40) return {};
    while (L < 51) {
        S.push_back('A');
        L++;
    }
    vector<vector<int>> v(N, vector<int>(N, 0));
    v[0][0] = S[0] - 'A';
    v[7][7] = S[50] - 'A';
    init();
    int ptr = 1;
    for (int s = 1; s <= 13; s++) {
        int len = (s <= 7 ? s + 1 : 15 - s);
        int msk = 0;
        for (int i = 0; i < len - 1; i++)
            msk |= ((S[ptr + i] - 'A') << i);
        msk = to[msk];
        for (int i = 0; i < 8; i++) {
            int j = s - i;
            if (j < 0 || j > 7) continue;
            v[i][j] = (msk & 1);
            msk >>= 1;
        }
        ptr += len - 1;
    }
    return v;
}

string Bordeaux(int N, int L, vector<vector<int>> v) {
    init();
    string S;
    S.push_back((v[0][0] ^ 1) + 'A');
    int x = 0, y = 0;
    for (int s = 1; s <= 13; s++) {
        int len = (s <= 7 ? s + 1 : 15 - s);
        int x1 = x + 1, y1 = y;
        int x2 = x, y2 = y + 1;
        int msk1 = 0, msk2 = 0;
        for (int i = 7; i >= 0; i--) {
            int j = s - i;
            if (j < 0 || j > 7) continue;
            msk1 <<= 1;
            msk1 |= (v[i][j] ^ (x1 == i && y1 == j));
            msk2 <<= 1;
            msk2 |= (v[i][j] ^ (x2 == i && y2 == j));
        }
        int msk = 0;
        if (from[msk1] != -1 && 0 <= x1 && x1 <= 7 && 0 <= y1 && y1 <= 7) {
            msk = msk1;
            x = x1;
            y = y1;
        }
        if (from[msk2] != -1 && 0 <= x2 && x2 <= 7 && 0 <= y2 && y2 <= 7) {
            msk = msk2;
            x = x2;
            y = y2;
        }
        msk = from[msk];
        for (int i = 0; i < len - 1; i++)
            S.push_back(((msk >> i) & 1) + 'A');
    }
    S.push_back((v[7][7] ^ 1) + 'A');
    while ((int) S.size() > L)
        S.pop_back();
    return S;
}
#Verdict Execution timeMemoryGrader output
Fetching results...