제출 #1283318

#제출 시각아이디문제언어결과실행 시간메모리
1283318datSnake Escaping (JOI18_snake_escaping)C++20
22 / 100
1193 ms14280 KiB
#include <bits/stdc++.h>

#define ll long long

using namespace std;

const int Nmax = 20, LIM = 1 << Nmax;

int n, q;
int a[LIM], f[LIM], f0[LIM];
string s;

void enter(){
    cin >> n >> q >> s;
    int lim = 1 << n;
    for(int i = 0; i < lim; i++){
        a[i] = f[i] = f0[i] = s[i] - '0';
    }

    for(int i = 0; i < n; i++){
        for(int mask = 0; mask < lim; mask++){
            if(mask >> i & 1) f[mask] += f[mask ^ (1 << i)];
            else f0[mask] += f0[mask ^ (1 << i)];
        }
    }


    for(int i = 0; i < q; i++){
        cin >> s;
        int one = 0, zero = 0, ques = 0;
        for(int j = 0; j < n; j++){
            int bit = 1 << (n - j - 1);
            if(s[j] == '?') ques |= bit;
            else if(s[j] == '1') one |= bit;
            else zero |= bit;
        }
        int ans = 0;
        if(__builtin_popcount(ques) <= 6){
            for(int sub = ques;; sub = (sub - 1) & ques){
                ans += a[sub | one];
                if(sub == 0) break;
            }
        }
        else if(__builtin_popcount(one) <= 6){
            for(int sub = one;; sub = (sub - 1) & one){
                int diff = __builtin_popcount(one) - __builtin_popcount(sub);
                if(diff & 1) ans -= f[sub | ques];
                else ans += f[sub | ques];

                if(sub == 0) break;
            }
        }
        else if(__builtin_popcount(zero) <= 6){
            for(int sub = zero;; sub = (sub - 1) & zero){
                int diff = __builtin_popcount(sub);
                if(diff & 1) ans -= f0[sub | ques];
                else ans += f0[sub | ques];

                if(sub == 0) break;
            }
        }
        cout << ans << '\n';
    }


}
int main(){
    //freopen("SNAKE.INP", "r", stdin);
    enter();




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