제출 #1137031

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

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

#define int long long
#define fi first
#define se second

void solve() {
    int n, q;
    cin >> n >> q;
    vector<int> a(1 << n);
    vector<int> popcnt(1 << n);
    vector<int> d(1 << n, 0), u(1 << n, 0);
    for (int i = 0; i < (1 << n); i++) {
        char c;
        cin >> c;
        a[i] = c - '0';
        d[i] = u[i] = a[i];
        popcnt[i] = __builtin_popcount(i);
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < (1 << n); j++) {
            if (j & (1 << i)) {
                d[j] += d[j ^ (1 << i)];
            } else u[j] += u[j ^ (1 << i)];
        }
    }
    while (q--) {
        string s;
        cin >> s;
        int zcnt = 0, ocnt = 0, qcnt = 0;
        for (int i = 0; i < n; i++) {
            if (s[i] == '0') zcnt++;
            else if (s[i] == '1') ocnt++;
            else qcnt++;
        }        
        if (qcnt <= 6) {
            int ans = 0;
            for (int i = 0; i < (1 << qcnt); i++) {
                int cnt = 0, msk = 0;
                for (int j = 0; j < n; j++) {
                    msk *= 2;
                    if (s[j] == '?') {
                        msk += !!(i & (1 << cnt));
                        cnt++;
                    } else msk += (s[j] - '0');
                }
                ans += a[msk];
            }
            cout << ans << '\n';
            continue;
        }
        if (ocnt <= 6) {
            int ans = 0, om = 0, qm = 0;
            for (int i = 0; i < n; i++) {
                if (s[i] == '1') om |= (1 << (n - i - 1));
                if (s[i] == '?') qm |= (1 << (n - i - 1));
            }
            for (int m = om;; m = (m - 1) & om) {
                ans += ((ocnt % 2 != popcnt[m] % 2) ? -1 : 1) * d[m + qm];
                if (!m) break;
            }
            cout << ans << '\n';
            continue;
        }
        if (zcnt <= 6) {
            int ans = 0, zm = 0, om = 0, qm = 0;
            for (int i = 0; i < n; i++) {
                if (s[i] == '0') zm |= (1 << (n - i - 1));
                if (s[i] == '1') om |= (1 << (n - i - 1));
                if (s[i] == '?') qm |= (1 << (n - i - 1));
            }
            for (int m = zm;; m = (m - 1) & zm) {
                ans += ((popcnt[m ^ zm] % 2) ? -1 : 1) * u[(om | (m ^ zm))];
                if (!m) break;
            }
            cout << ans << '\n';
            continue;
        }
    }
}

int32_t main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int test = 1;
    // cin >> test;
    while (test--) 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...