Submission #1037892

#TimeUsernameProblemLanguageResultExecution timeMemory
1037892vjudge1Snake Escaping (JOI18_snake_escaping)C++17
100 / 100
1114 ms47604 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define pb                  push_back
#define all(x)              x.begin(), x.end()

const int mxn = 2e6 + 3;
const int lg = 21;

int n, q;

int A[mxn];
int dp[mxn], pd[mxn];

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

    cin >> n >> q;
    string s; cin >> s;
    for(int i = 0; i < (1 << n); i ++) {
        int x = (s[i] - '0');
        A[i] = x;
        dp[i] = pd[i] = x;
    }

    for(int i = 0; i < n; i ++)
        for(int mask = 0; mask < (1 << n); mask ++)
            if(mask >> i & 1)
                dp[mask] += dp[mask ^ (1 << i)];
            else
                pd[mask] += pd[mask ^ (1 << i)];

    while(q --) {
        vector<int> c0, c1, c2; int x = 0;
        string st; cin >> st;
        reverse(all(st));
        for(int i = 0; i < n; i ++) {
            char c = st[i];
            if(c == '1')
                x += (1 << i);
            if(c == '0') c0.pb(i);
            if(c == '1') c1.pb(i);
            if(c == '?') c2.pb(i);
        }
        if(c2.size() <= 6) {
            int f = c2.size(), ans = 0;
            for(int mask = 0; mask < (1 << f); mask ++) {
                int y = x;
                for(int i = 0; i < f; i ++)
                    if(mask >> i & 1)
                        y ^= (1 << c2[i]);
                ans += A[y];
            }
            cout << ans << '\n';
            continue;
        }
        if(c1.size() <= 6) {
            int f = c1.size();
            for(int i : c2)
                x ^= (1 << i);
            int ans = 0;
            for(int mask = 0; mask < (1 << f); mask ++) {
                int y = x;
                for(int i = 0; i < f; i ++)
                    if(mask >> i & 1)
                        y ^= (1 << c1[i]);
                if(__builtin_popcount(mask) & 1)
                    ans -= dp[y];
                else
                    ans += dp[y];
            }
            cout << ans << '\n';
            continue;
        }
        if(c0.size() <= 6) {
            int f = c0.size();
            int ans = 0;
            for(int mask = 0; mask < (1 << f); mask ++) {
                int y = x;
                for(int i = 0; i < f; i ++)
                    if(mask >> i & 1)
                        y ^= (1 << c0[i]);
                if(__builtin_popcount(mask) & 1)
                    ans -= pd[y];
                else
                    ans += pd[y];
            }
            cout << ans << '\n';
            continue;
        }
    }

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