Submission #1349598

#TimeUsernameProblemLanguageResultExecution timeMemory
1349598Kirill22Snake Escaping (JOI18_snake_escaping)C++20
100 / 100
417 ms21728 KiB
#pragma GCC optimize("O3")
#include <bits/allocator.h>
#pragma GCC target("avx2")
#include "bits/stdc++.h"

using namespace std;

using ll = long long;

void solve () {
    int n, q; string s;
    cin >> n >> q >> s;
    vector<int> a(1 << n);
    for (int i = 0; i < (1 << n); i++) {
        a[i] = s[i] - '0';
    }
    auto copy_a = a;
    auto b = a;
    for (int j = 0; j < n; j++) {
        for (int i = 0; i < (1 << n); i++) {
            if (i >> j & 1) a[i] += a[i - (1 << j)];
        }
    }
    for (int j = 0; j < n; j++) {
        for (int i = 0; i < (1 << n); i++) {
            if (i >> j & 1) b[i - (1 << j)] += b[i];
        }
    }
    while (q--) {
        string s;
        cin >> s;
        std::reverse(s.begin(), s.end());
        int know = 0, mask = 0;
        for (int i = 0; i < n; i++) {
            if (s[i] == '1') {
                know += (1 << i);
            } else if (s[i] == '?') {
                mask += (1 << i);
            }
        }
        int ans = 0;
        if (__builtin_popcount(mask) <= 7) {
            for (int msk = mask; ; msk = ((msk - 1) & mask)) {
                ans += copy_a[msk | know];
                if (msk == 0) break;
            }
        } else if (__builtin_popcount(know) <= 7) {
            for (int msk = know; ; msk = ((msk - 1) & know)) {
                if (__builtin_popcount(msk) % 2 == __builtin_popcount(know) % 2) {
                    ans += a[msk | mask];
                } else {
                    ans -= a[msk | mask];
                }
                if (msk == 0) break;
            }
        } else {
            int unknown = (1 << n) - 1 - know - mask;
            for (int msk = unknown; ; msk = ((msk - 1) & unknown)) {
                if (__builtin_popcount(msk) % 2 == 0) {
                    ans += b[msk | know];
                } else {
                    ans -= b[msk | know];
                }
                if (msk == 0) break;
            }
        }
        cout << ans << '\n';
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
//    cin >> t;
    while (t--) {
        solve();
    }
}
#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...