제출 #1275717

#제출 시각아이디문제언어결과실행 시간메모리
1275717MisterReaperSnake Escaping (JOI18_snake_escaping)C++20
0 / 100
1 ms572 KiB
// File snakeescaping.cpp created on 03.10.2025 at 10:26:25
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N, Q;
    std::cin >> N >> Q;

    std::string S;
    std::cin >> S;

    std::vector<int> v(1 << N);
    for (int i = 0; i < (1 << N); ++i) {
        v[i] = int(S[i] - '0');
    }

    std::vector<int> sp(1 << N), sb(1 << N), pp(1 << N);
    for (int i = 0; i < (1 << N); ++i) {
        sp[i] = v[i];
        sb[i] = v[i];
    }
    for (int i = 1; i < (1 << N); i <<= 1) {
        for (int j = 0; j < (1 << N); j += i << 1) {
            for (int k = 0; k < i; ++k) {
                sp[j + k] += sp[i + j + k];
                sb[i + j + k] += sb[j + k];
            }
        }
    }
    pp[0] = +1;
    for (int i = 1; i < (1 << N); ++i) {
        pp[i] = pp[i ^ (i & -i)] * -1;
    }

    while (Q--) {
        std::string T;
        std::cin >> T;

        std::reverse(T.begin(), T.end());

        int cnt0 = 0, cnt1 = 0, cntq = 0;
        for (int i = 0; i < N; ++i) {
            if (T[i] == '0') {
                cnt0 += 1;
            } else if (T[i] == '1') {
                cnt1 += 1;
            } else {
                cntq += 1;
            }
        }

        if (cntq <= cnt0 && cntq <= cnt1) {
            int msk = 0, init = 0;
            for (int i = 0; i < N; ++i) {
                if (T[i] == '?') {
                    msk |= 1 << i;
                } else if (T[i] == '1') {
                    init |= 1 << i;
                }
            }
            int ans = 0;
            for (int m = msk; ; m = (m - 1) & msk) {
                ans += v[m | init];
                if (m == 0) {
                    break;
                }
            }
            std::cout << ans << '\n';
        } else if (cnt0 <= cnt1 && cnt0 <= cntq) {
            int msk = 0, init = 0;
            for (int i = 0; i < N; ++i) {
                if (T[i] == '0') {
                    msk |= 1 << i;
                } else if (T[i] == '1') {
                    init |= 1 << i;
                }
            }
            int ans = 0;
            for (int m = msk; ; m = (m - 1) & msk) {
                ans += pp[m] * sp[m | init];
                if (m == 0) {
                    break;
                }
            }
            std::cout << ans << '\n';
        } else {
            int msk = 0, init = 0;
            for (int i = 0; i < N; ++i) {
                if (T[i] == '1') {
                    msk |= 1 << i;
                } else if (T[i] == '?') {
                    init |= 1 << i;
                }
            }
            int ans = 0;
            for (int m = msk; ; m = (m - 1) & msk) {
                debug(m, pp[m], sb[m | init]);
                ans += pp[m] * sb[m | init];
                if (m == 0) {
                    break;
                }
            }
            std::cout << ans << '\n';
        }
        debug();
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...