Submission #1304022

#TimeUsernameProblemLanguageResultExecution timeMemory
1304022tranthanh506Snake Escaping (JOI18_snake_escaping)C++17
100 / 100
480 ms33024 KiB
#include <bits/stdc++.h>
using namespace std;

#define For(i, a, b, x) for (int i = (a); i <= (b); i += (x))
#define Ford(i, a, b, x) for (int i = (a); i >= (b); i -= (x))

typedef pair<int, int> pii;

long long n, q, ans, a[(1 << 22) + 5], dp1[(1 << 22) + 5], dp2[(1 << 22) + 5], one, zero, question, bitO, bitZ, bitQ;
string s;
char x;

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

//    freopen("voi.inp", "r", stdin);
//    freopen("voi.out", "w", stdout);

    cin >> n >> q;
    For(i, 0, (1 << n) - 1, 1){
        cin >> x;
        a[i] = dp1[i] = dp2[i] = x - '0';
    }

    For(i, 0, n - 1, 1){
        For(mask, 0, (1 << n) - 1, 1){
            if ((mask >> i) & 1) dp1[mask] += dp1[mask ^ (1 << i)];
        }
    }

    For(i, 0, n - 1, 1){
        For(mask, 0, (1 << n) - 1, 1){
            if (!((mask >> i) & 1)) dp2[mask] += dp2[mask | (1 << i)];
        }
    }

    For(i, 1, q, 1){
        cin >> s;
        reverse(s.begin(), s.end());
        one = zero = question = ans = 0;

        For(j, 0, s.size() - 1, 1){
            if (s[j] == '1') one |= (1 << j);
            if (s[j] == '0') zero |= (1 << j);
            if (s[j] == '?') question |= (1 << j);
        }

        bitO = __builtin_popcount(one);
        bitZ = __builtin_popcount(zero);
        bitQ = __builtin_popcount(question);

        if (bitQ <= 6) {
            ans = a[one];
            for (int sub = question; sub > 0; sub = (sub - 1) & question) ans += a[sub | one];
        }else if (bitO <= 6) {
            ans = dp1[question] * ((bitO & 1) ? -1 : 1);
            for (int sub = one; sub > 0; sub = (sub - 1) & one){
                if ((__builtin_popcount(sub) & 1) != (bitO & 1)) ans -= dp1[sub | question];
                else ans += dp1[sub | question];
            }
        }else if (bitZ <= 6) {
            ans = dp2[one];
            for (int sub = zero; sub > 0; sub = (sub - 1) & zero){
                if ((__builtin_popcount(sub) & 1)) ans -= dp2[sub | one];
                else ans += dp2[sub | one];
            }
        }

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