Submission #1276720

#TimeUsernameProblemLanguageResultExecution timeMemory
1276720coderg300711Snake Escaping (JOI18_snake_escaping)C++20
100 / 100
448 ms26032 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

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

    string s;
    cin >> s;

    vector<int> v(1 << n);
    for (int i = 0; i < (1 << n); ++i) {
        v[i] = int(s[i] - '0');
    }

    vector<int> sp(1 << n), sb(1 << n), pp(1 << n);
    for (int i = 0; i < (1 << n); ++i) {
        sp[i] = v[i];
        sb[i] = v[i];
    }
    for (int i = 1; i < (1 << n); i <<= 1) {
        for (int j = 0; j < (1 << n); j += i << 1) {
            for (int k = 0; k < i; ++k) {
                sp[j + k] += sp[i + j + k];
                sb[i + j + k] += sb[j + k];
            }
        }
    }
    pp[0] = +1;
    for (int i = 1; i < (1 << n); ++i) {
        pp[i] = pp[i ^ (i & -i)] * -1;
    }

    while (q--) {
        string t;
        cin >> t;
        reverse(t.begin(), t.end());

        int cnt0 = 0, cnt1 = 0, cntq = 0;
        for (int i = 0; i < n; ++i) {
            if (t[i] == '0') {
                cnt0 += 1;
            } else if (t[i] == '1') {
                cnt1 += 1;
            } else {
                cntq += 1;
            }
        }

        if (cntq <= cnt0 && cntq <= cnt1) {
            int msk = 0, init = 0;
            for (int i = 0; i < n; ++i) {
                if (t[i] == '?') {
                    msk |= 1 << i;
                } else if (t[i] == '1') {
                    init |= 1 << i;
                }
            }
            int ans = 0;
            for (int m = msk; ; m = (m - 1) & msk) {
                ans += v[m | init];
                if (m == 0) {
                    break;
                }
            }
            cout << ans << '\n';
        } else if (cnt0 <= cnt1 && cnt0 <= cntq) {
            int msk = 0, init = 0;
            for (int i = 0; i < n; ++i) {
                if (t[i] == '0') {
                    msk |= 1 << i;
                } else if (t[i] == '1') {
                    init |= 1 << i;
                }
            }
            int ans = 0;
            for (int m = msk; ; m = (m - 1) & msk) {
                ans += pp[m] * sp[m | init];
                if (m == 0) {
                    break;
                }
            }
            cout << ans << '\n';
        } else {
            int msk = 0, init = 0;
            for (int i = 0; i < n; ++i) {
                if (t[i] == '1') {
                    msk |= 1 << i;
                } else if (t[i] == '?') {
                    init |= 1 << i;
                }
            }
            int ans = 0;
            for (int m = msk; ; m = (m - 1) & msk) {
                ans += pp[m] * sb[(msk ^ m) | init];
                if (m == 0) {
                    break;
                }
            }
            cout << ans << '\n';
        }
    }

    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...