Submission #1213856

#TimeUsernameProblemLanguageResultExecution timeMemory
1213856Hamed_GhaffariSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
494 ms17848 KiB
#include <bits/stdc++.h>
using namespace std;

#define pop(x) __builtin_popcount(x)

const int MXL = 20;

int L, Q, sub[1<<MXL], sup[1<<MXL];
string s, t;

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> L >> Q >> s;
    for(int i=0; i<(1<<L); i++)
        sub[i] = sup[i] = s[i]-'0';
    for(int i=0; i<L; i++)
        for(int j=0; j<(1<<L); j++)
            if(j>>i&1) sub[j] += sub[j^(1<<i)];
            else sup[j] += sup[j^(1<<i)];
    while(Q--) {
        cin >> t;
        int msk0=0, msk1=0, msk2=0, ans=0;
        for(int i=0; i<L; i++)
            if(t[i]=='0') msk0 ^= 1<<(L-1-i);
            else if(t[i]=='1') msk1 ^= 1<<(L-1-i);
            else msk2 ^= 1<<(L-1-i);
        if(pop(msk0)<=L/3)
            for(int i=msk0; ; i = (i-1)&msk0) {
                ans += sup[i^msk1]*((pop(i)&1) ? -1 : 1);
                if(!i) break;
            }
        else if(pop(msk1)<=L/3)
            for(int i=msk1; ; i = (i-1)&msk1) {
                ans += sub[i^msk2]*(((pop(msk1)-pop(i))&1) ? -1 : 1);
                if(!i) break;
            }
        else
            for(int i=msk2; ; i = (i-1)&msk2) {
                ans += s[i^msk1]-'0';
                if(!i) break;
            }
        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...