Submission #1110865

#TimeUsernameProblemLanguageResultExecution timeMemory
1110865anmattroiSnake Escaping (JOI18_snake_escaping)C++14
100 / 100
557 ms46408 KiB
#include <bits/stdc++.h>

using namespace std;

int L, q;
int a[1<<20], Dp_sub[1<<20], Dp_par[1<<20], dem[1<<20];

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



    cin >> L >> q;
    for (int i = 0; i < (1<<L); i++) {
        char c; cin >> c;
        a[i] = Dp_sub[i] = Dp_par[i] = c-'0';
        dem[i] = __builtin_popcount(i);
    }

    for (int i = 0; i < L; i++) {
        for (int mask = 0; mask < (1<<L); ++mask) {
            if ((mask>>i)&1) Dp_sub[mask] += Dp_sub[mask^(1<<i)];
            else Dp_par[mask] += Dp_par[mask^(1<<i)];
        }
    }

    auto sub1 = [&](const string &s) -> void {
        int mask = 0, Smask = 0;
        for (int i = 0; i < L; i++) {
            if (s[i] != '?') mask |= ((s[i]-'0') << i);
            else Smask |= (1<<i);
        }
        int ans = a[mask];
        for (int i = Smask; i > 0; i = (i-1)&Smask) ans += a[i^mask];
        cout << ans << "\n";
    };

    auto sub2 = [&](const string &s) -> void {
        int mask = 0, Smask = 0;
        for (int i = 0; i < L; i++) {
            if (s[i] == '1') {
                Smask |= (1<<i);
                mask |= (1<<i);
            } else if (s[i] == '?') mask |= (1<<i);
        }
        int ans = Dp_sub[mask];

        for (int i = Smask; i > 0; i = (i-1)&Smask) {
            if (dem[i]&1) ans -= Dp_sub[mask^i];
            else ans += Dp_sub[mask^i];
        }
        cout << ans << "\n";
    };

    auto sub3 = [&](const string &s) -> void {
        int mask = 0, Smask = 0;
        for (int i = 0; i < L; i++) {
            if (s[i] == '0') Smask |= (1<<i);
            else if (s[i] == '1') mask |= (1<<i);
        }
        int ans = Dp_par[mask];

        for (int i = Smask; i > 0; i = (i-1)&Smask) {
            if (dem[i]&1) ans -= Dp_par[mask^i];
            else ans += Dp_par[mask^i];
        }
        cout << ans << "\n";
    };

    while (q--) {
        string s; cin >> s;
        reverse(s.begin(), s.end());
        int cnt0 = 0, cnt1 = 0, cnt2 = 0;
        for (char ch : s) {
            switch (ch) {
                case '0' :
                    ++cnt0;
                    break;
                case '1' :
                    ++cnt1;
                    break;
                case '?' :
                    ++cnt2;
                    break;
                }
        }
        if (cnt2 <= 6) sub1(s);
        else if (cnt1 <= 6) sub2(s);
        else sub3(s);
    }
}
#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...