제출 #1336276

#제출 시각아이디문제언어결과실행 시간메모리
1336276Braabebo10Snake Escaping (JOI18_snake_escaping)C++20
100 / 100
305 ms20656 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define ll int
#define nl "\n"
#define all(v) v.begin(),v.end()
#define baraa ios_base::sync_with_stdio(false);cin.tie(NULL);
using namespace std;

int main() {
    baraa
    ll m, q;
    cin >> m >> q;
    ll n = (1LL << m);
    vector<ll> dp(n), dp2(n), v(n);
    for (ll i = 0; i < n; i++) {
        char c;
        cin >> c;
        dp[i] = dp2[i] = v[i] = c - '0';
    }
    for (ll bit = 0; bit < m; bit++)
        for (ll msk = 0; msk < n; msk++) {
            if (msk >> bit & 1)dp[msk] += dp[msk ^ (1LL << bit)];
            else dp2[msk] += dp2[msk ^ (1LL << bit)];
        }
    while (q--) {
        string s;
        cin >> s;
        reverse(all(s));
        ll a = 0, b = 0, c = 0, res = 0;
        for (ll i = 0; i < m; i++) {
            a += (1LL << i) * (s[i] == '0');
            b += (1LL << i) * (s[i] == '1');
            c += (1LL << i) * (s[i] == '?');
        }
        ll mni = min({__builtin_popcountll(a), __builtin_popcountll(b), __builtin_popcountll(c)});
        if (mni == __builtin_popcountll(a)) {
            for (ll msk = a; msk; msk = (msk - 1) & a)
                res += (__builtin_popcountll(msk) & 1 ? -1 : 1) * dp2[b | msk];
            res += dp2[b];
        } else if (mni == __builtin_popcountll(b)) {
            for (ll msk = b; msk; msk = (msk - 1) & b)
                res += (__builtin_popcountll(msk) & 1 ? -1 : 1) * dp[(b ^ msk) | c];
            res += dp[c | b];
        } else {
            for (ll msk = c; msk; msk = (msk - 1) & c)
                res += v[b | msk];
            res += v[b];
        }
        cout << res << nl;
    }
    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...