제출 #1365096

#제출 시각아이디문제언어결과실행 시간메모리
1365096msab3fSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
354 ms21904 KiB
#include <bits/stdc++.h>
using namespace std;

#define pc(x) __builtin_popcount(x)

const int MAX_L = 21;
const int MAX_MASK = 1 << MAX_L;

int l, q, c[MAX_MASK], subs[MAX_MASK], supers[MAX_MASK];
string s;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    
    cin >> l >> q >> s;

    for (int i = 0; i < (1 << l); ++i) {
        c[i] = s[i] - '0';
        subs[i] = supers[i] = c[i];
    }

    for (int j = 0; j < l; ++j) {
        for (int i = 0; i < (1 << l); ++i) {
            if ((i >> j) & 1) {
                subs[i] += subs[i ^ (1 << j)];
            } else {
                supers[i] += supers[i ^ (1 << j)];
            }
        }
    }

    while (q--) {
        string t;
        cin >> t;
        int ones = 0, zeroes = 0, nones = 0, cnt[] = {0, 0, 0};
        for (int i = 0; i < l; ++i) {
            if (t[i] == '1') {
                ones |= 1 << (l - 1 - i);
                ++cnt[0];
            } else if (t[i] == '0') {
                zeroes |= 1 << (l - 1 - i);
                ++cnt[1];
            } else {
                nones |= 1 << (l - 1 - i);
                ++cnt[2];
            }
        }
        int ans = 0;
        if (cnt[0] <= 6) {
            int base = ones | nones;
            ans = subs[base];
            for (int i = ones; i > 0; i = (i - 1) & ones) {
                if (pc(i) & 1) {
                    ans -= subs[base ^ i];
                } else {
                    ans += subs[base ^ i];
                }
            }
        } else if (cnt[1] <= 6) {
            int base = ones;
            ans = supers[base];
            for (int i = zeroes; i > 0; i = (i - 1) & zeroes) {
                if (pc(i) & 1) {
                    ans -= supers[base ^ i];
                } else {
                    ans += supers[base ^  i];
                }
            }
        } else {
            int base = ones;
            ans = c[base];
            for (int i = nones; i > 0; i = (i - 1) & nones) {
                ans += c[base ^ i];
            }
        }
        cout << ans << '\n';
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…