제출 #1305973

#제출 시각아이디문제언어결과실행 시간메모리
1305973tntSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1584 ms25976 KiB
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("Ofast,unroll-loops,fast-math,O3")

#define pb push_back                    
#define ll long long
#define sz(v) int(v.size())
#define all(v) v.begin(),v.end()

int mod =  1e9 + 7;
const int N = 1048576 + 100;
const ll inf = 2e18;
ll dp[N],dp1[N];
void solve(){  
    int l,q;
    cin >> l >> q;
    int n = (1 << l);
    string s,t;
    cin >> s;
    for(int i = 0; i < n; i++) dp[i] = dp1[i] = s[i] - '0';
    for(int i = 0; i < l; i++){
        for(int mask = n - 1; mask>= 0; mask--){
            if((mask >> i & 1) == 0){
                dp[mask] += dp[(mask | (1 << i))];
            }
        }
    }
    for(int i = 0; i < l; i++){
        for(int mask = 0; mask < n; mask++){
            if((mask >> i & 1) == 1){
                dp1[mask] += dp1[(mask ^ (1 << i))];
            }
        }
    }
    while(q--){
        cin >> t;
        int cnt = 0,cnt1 = 0;
        for(int i = 0; i < l; i++){
            if(t[i] == '1') cnt++;
            else if(t[i] != '0') cnt1++;
        }
        if(cnt1 <= 6){
            vector <int> v;
            int cur = 0,mask = 0;
            for(int i = l - 1; i >= 0; i--){
                if(t[i] == '?') v.pb(cur);
                else mask += (1 << cur) * (t[i] == '1');
                cur++;
            }
            ll sum = 0;
            for(int mask1 = 0; mask1 < (1 << sz(v)); mask1++){
                int mask2 = mask;
                for(int j = 0; j < sz(v); j++){
                    if((mask1 >> j & 1) == 1) mask2 |= (1 << v[j]);
                }
                sum += s[mask2] - '0';
            }
            cout << sum << '\n';
        }
        else if(cnt > 6){
            vector <int> v;
            int cur = 0,mask = 0;
            for(int i = l - 1; i >= 0; i--){
                if(t[i] == '0') v.pb(cur);
                else if(t[i] == '1') mask += (1 << cur);
                cur++;
            }
            ll sum = 0;
            for(int mask1 = 0; mask1 < (1 << sz(v)); mask1++){
                int mask2 = mask;
                for(int j = 0; j < sz(v); j++){
                    if((mask1 >> j & 1) == 1) mask2 |= (1 << v[j]);
                }
                if(__builtin_popcount(mask1) % 2 == 1) sum -= dp[mask2];
                else sum += dp[mask2];
            }
            cout << sum << '\n';
        }
        else{
            vector <int> v;
            int cur = 0,mask = 0;
            for(int i = l - 1; i >= 0; i--){
                if(t[i] == '1') mask += (1 << cur),v.pb(cur);
                else if(t[i] == '?')mask += (1 << cur);
                cur++;
            }
            ll sum = 0;
            for(int mask1 = 0; mask1 < (1 << sz(v)); mask1++){
                int mask2 = mask;
                for(int j = 0; j < sz(v); j++){
                    if((mask1 >> j & 1) == 1) mask2 -= (1 << v[j]);
                }
                if(__builtin_popcount(mask1) % 2 == 1) sum -= dp1[mask2];
                else sum += dp1[mask2];
            }
            cout << sum << '\n';
        }
    }
}
signed main(){
    //freopen("time.in", "r", stdin);
    //freopen("time.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t1 = 1;
    while(t1--){
    	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...