제출 #1239327

#제출 시각아이디문제언어결과실행 시간메모리
1239327dwuySnake Escaping (JOI18_snake_escaping)C++17
22 / 100
259 ms9960 KiB
#include <bits/stdc++.h>
#define MASK(x) (1LL<<(x))
#define endl '\n'
using namespace std;

const int MX = MASK(20);
int n, m;
string s;
int f[MX], rf[MX];

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m;
    cin >> s;
    
    for(int i=0; i<MASK(n); i++) f[i] = rf[i] = s[i] - '0';
    for(int i=0; i<n; i++){
        for(int mask=0; mask<MASK(n); mask++){
            mask |= MASK(i);
            f[mask] += f[mask ^ MASK(i)];
            rf[mask ^ MASK(i)] += rf[mask];
        }
    }
    
    while(m--){
        string s; cin >> s;
        reverse(s.begin(), s.end());
        int m0, m1, m2; m0 = m1 = m2 = 0;
        for(int i=0; i<n; i++){
            if(s[i] == '0') m0 += MASK(i);
            if(s[i] == '1') m1 += MASK(i);
            if(s[i] == '?') m2 += MASK(i);
        }
        
        int ans = 0;
        if(__builtin_popcount(m0) < 7){
            for(int mask=m0; ;mask=(mask - 1)&m0){
                if(__builtin_popcount(mask)&1) ans -= rf[m1|mask];
                else ans += rf[m1|mask];
                if(mask == 0) break;
            }
        }
        else if(__builtin_popcount(m1) < 7){
            for(int mask=m1; ;mask=(mask - 1)&m1){
                if(__builtin_popcount(mask^m1   )&1) ans -= f[m2|mask];
                else ans += f[m2|mask];
                if(mask == 0) break;
            }
        }
        else{
            for(int mask=m2; ;mask=(mask - 1)&m2){  
                ans += s[m1 | mask] - '0';
                if(mask == 0) 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...