Submission #1304116

#TimeUsernameProblemLanguageResultExecution timeMemory
1304116trung_tinSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1079 ms17688 KiB
#include<bits/stdc++.h>
using namespace std;


typedef long long ll;
typedef pair<ll, ll> ii;
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x.size())
#define MASK(i) (1ll << i)
#define debug cout << "[Debug line] " << __LINE__ << ": "


const int N = 20;
const int M = 2e3 + 5;
const int INF = INT_MAX;


int L, q;
string s;
int a[MASK(N) + 5], f[MASK(N) + 5];


void solve() {
    cin >> L >> q >> s;

    for (int i = 0; i < sz(s); i++) {
        f[i] = a[i] = s[i] - '0';
    }

    int full = MASK(L) - 1;
    for (int i = 0; i < L; i++) {
        for (int mask = 0; mask <= full; mask++) {
            if (!(mask >> i & 1)) {
                f[mask] += f[mask ^ MASK(i)];
            }
        }
    }

    for (int i = 1; i <= q; i++) {
        string T; cin >> T;

        int mask0, mask1, maskQues;
        mask0 = mask1 = maskQues = 0;

        int c0, cQ;
        c0 = cQ = 0;

        for (int j = L - 1; j >= 0; j--) {
            if (T[j] == '0') {
                c0++; mask0 += MASK(L - j - 1);
            }
            else if (T[j] == '1') {
                mask1 += MASK(L - j - 1);
            }
            else {
                cQ++; maskQues += MASK(L - j - 1);
            }
        }

        int res = 0;
        if (c0 < cQ) {
            res = f[mask1];
            for (int sub = mask0; sub != 0; sub = (sub - 1) & mask0) {
                if (__builtin_popcount(sub) & 1) res -= f[sub | mask1];
                else res += f[sub | mask1];
            }
        }
        else {
            res = a[mask1];
            for (int sub = maskQues; sub != 0; sub = (sub - 1) & maskQues) {
                res += a[mask1 | sub];
            }
        }

        cout << res << '\n';
    }

}


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

//    #define TASK "PERMATRIX"
//    freopen(TASK".inp", "r", stdin);
//    freopen(TASK".out", "w", stdout);

    int T = 1;
//    cin >> T;
    while (T--) {
        solve();
    }
}
#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...