Submission #334791

#TimeUsernameProblemLanguageResultExecution timeMemory
334791HoneyBadgerSnake Escaping (JOI18_snake_escaping)C++17
100 / 100
1263 ms24816 KiB
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <vector>
#include <bitset>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <utility>
#include <algorithm>
#include <random>
#include <cmath>
#include <cassert>
#include <climits>
#include <ctime>
#include <chrono>
 
 
 
#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx,avx2,tune=native")
 
 
 
#ifdef LOCAL
    #define dbg(x) cout << #x << " : " << x << endl;
#else
    #define dbg(x)
#endif
 
 
#define pb push_back
#define ppb pop_back()
#define mp make_pair
#define fi(a, b) for (int i = a; i < b; i++)
#define fj(a, b) for (int j = a; j < b; j++)
#define fk(a, b) for (int k = a; k < b; k++)
#define fi1(a, b) for (int i = a - 1; i >= b; i--)
#define fj1(a, b) for (int j = a - 1; j >= b; j--)
#define fk1(a, b) for (int k = a - 1; k >= b; k--)
#define fx(x, a) for (auto& x : a)
#define rep(i, a, b) for (int i = a; i < b; ++i)
#define rep1(i, a, b) for (int i = a - 1; i >= b; --i)
#define siz(x) (int)x.size()
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
 
using namespace std;
 
template<typename T1, typename T2>inline void mine(T1 &x, const T2 &y) { if (y < x) x = y; }
template<typename T1, typename T2>inline void maxe(T1 &x, const T2 &y) { if (x < y) x = y; }
 
ostream& operator << (ostream &out, const vector<int> &b) {
    for (auto k : b) out << k << ' ';
    return out;
}
 
typedef long long ll;
typedef long double ld;
typedef char ch;
typedef string str;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vpii;
typedef vector<vpii> vvpii;
typedef vector<ch> vch;
typedef vector<vch> vvch;
typedef vector<str> vs;
 
 
 
const int MOD = 1000000007;
const int INF = 1000000050;
const long long BIG = (long long)2e18 + 50;
const int MX = 1 << 20;
const int PW = 20;
const double EPS = 1e-9;
 
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
int n, q;
int a[MX];
int sos1[MX];
int sos0[MX];
int bits[MX];
 
void calc() {
    for (int mask = 0; mask < (1 << n); ++mask) {
        sos1[mask] = a[mask];
        sos0[mask] = a[mask];
        bits[mask] = bits[mask >> 1] + (mask & 1);
    }
    for (int i = 0; i < n; ++i) {
        for (int mask = 0; mask < (1 << n); ++mask) {
            if ((mask >> i) & 1) {
                sos1[mask] += sos1[mask ^ (1 << i)];
            } else {
                sos0[mask] += sos0[mask ^ (1 << i)];
            }
        }
    }
 
}
 
int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    cin >> n >> q;
    for (int i = 0; i < (1 << n); ++i) {
        char c;
        cin >> c;
        a[i] = c - '0';
    }
 
    calc();
    while (q--) {
        int mq = 0, m0 = 0, m1 = 0;
        fi(0, n) {
            char c;
            cin >> c;
            mq = (mq << 1) | (c == '?');
            m0 = (m0 << 1) | (c == '0');
            m1 = (m1 << 1) | (c == '1');
        }
        int ans = 0;
        if (bits[mq] < 7) {
            for (int mask = mq;;mask = (mask - 1) & mq) {
                ans += a[m1 ^ mask];
                if (!mask) break;
            }
        } else if (bits[m0] < 7) {
            for (int mask = m0;;mask = (mask - 1) & m0) {
                ans += sos0[m1 ^ mask] * (bits[mask] % 2 ? -1 : 1);
                if (!mask) break;
            }
        } else {
            for (int mask = m1;;mask = (mask - 1) & m1) {
                ans += sos1[mq ^ mask] * (bits[mask ^ m1] % 2 ? -1 : 1);
                if (!mask) break;
            }
        }
        cout << ans << '\n';
    }
}
#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...