Submission #1306167

#TimeUsernameProblemLanguageResultExecution timeMemory
1306167uranium235Snake Escaping (JOI18_snake_escaping)C++17
100 / 100
398 ms20924 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int bits = 6;
const int mod = 1'000'000'007;

template <class a, class b> ostream& operator<<(ostream &l, const pair<a, b> &r) {
    l << "(" << r[0] << ", " << r.second << ")";
    return l;
}

template <class t, unsigned long int s> ostream& operator<<(ostream &l, const array<t, s> &r) {
    l << "[";
    for (int i = 0; i + 1 < s; i++) l << r[i] << ", ";
    if (s > 0) l << r[s - 1];
    l << "]";
    return l;
}

template <class t> ostream& operator<<(ostream &l, const vector<t> &r) {
    l << "{";
    for (int i = 0; i + 1 < r.size(); i++) l << r[i] << ", ";
    if (!r.empty()) l << r.back();
    l << "}";
    return l;
}

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

    int n, q;
    cin >> n >> q;

    vector<int> a(1 << n), sos(1 << n), oso(1 << n);
    for (int i = 0; i < (1 << n); i++) {
        char c;
        cin >> c;
        a[i] = c - '0';
    }
    sos = a;
    oso = a;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < (1 << n); j++) {
            if (j & (1 << i)) {
                sos[j] += sos[j ^ (1 << i)];
            } else {
                oso[j] += oso[j ^ (1 << i)];
            }
        }
    }

    for (int i = 0; i < q; i++) {
        string s;
        cin >> s;
        int zeroes = 0, ones = 0, qs = 0;
        for (int j = 0; j < n; j++) {
            if (s[n - 1 - j] == '0') zeroes |= 1 << j;
            else if (s[n - 1 - j] == '1') ones |= 1 << j;
            else qs |= 1 << j;
        }

        int ans = 0;
        if (__builtin_popcount(zeroes) <= 6) {
            for (int j = zeroes; j > 0; j = (j - 1) & zeroes) {
                ans += oso[ones | j] * (__builtin_parity(j) ? -1 : 1);
            }
            ans += oso[ones];
        } else if (__builtin_popcount(ones) <= 6) {
            for (int j = ones; j > 0; j = (j - 1) & ones) {
                ans += sos[qs | j] * (__builtin_parity(j ^ ones) ? -1 : 1 );
            }
            ans += sos[qs] * (__builtin_parity(ones) ? -1 : 1);
        } else {
            for (int j = qs; j > 0; j = (j - 1) & qs) {
                ans += a[ones | j];
            }
            ans += a[ones];
        }
        cout << ans << '\n';
    }
}
#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...