Submission #1144925

#TimeUsernameProblemLanguageResultExecution timeMemory
1144925Robert_juniorSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1058 ms26108 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define ins insert
#define all(x) x.begin(), x.end()
#define F first
#define S second
const int N  = (1<<21);
int dp[N], dp1[N];
int a[N];
void solve(){
    int L, q;
    string s;
    cin>>L>>q>>s;
    for(int i = 0; i < s.size(); i++){
        dp[i] = dp1[(((1<<L) - 1) ^ i)] = s[i] - '0';
    }
    for(int i = 0; i < L; i++){
        for(int msk = 0; msk < (1<<L); msk++){
            if((msk>>i) & 1){
                dp[(msk ^ (1<<i))] += dp[msk];
                dp1[(msk ^ (1<<i))] += dp1[msk];
            }
        }
    }
    while(q--){
        string t;
        cin>>t;
        reverse(all(t));
        int cnt[3] = {0, 0, 0};
        for(auto it : t){
            if(it == '?') cnt[2]++;
            else cnt[it - '0']++;
        }
        if(cnt[2] <= 6){
            int ans = 0;
            int msk = 0;
            vector<int>v;
            for(int i = 0; i < L; i++){
                if(t[i] == '1') msk |= (1<<i) ;
                else if(t[i] == '?') v.pb(i);
            }
            for(int msk1 = 0; msk1 < (1<<v.size()); msk1++){
                int msk2 = msk;
                for(int i = 0; i < v.size(); i++){
                    if((msk1>>i) & 1){
                        msk2 |= (1<<v[i]);
                    }
                }
                ans += s[msk2] - '0';
            }
            cout<<ans<<'\n';
        }
        else if(cnt[0] <= 6){
            int msk = 0;
            vector<int>v;
            for(int i = 0; i < L; i++){
                if(t[i] == '1') msk |= (1<<i) ;
                else if(t[i] == '0') v.pb(i);
            }
            int ans = 0;
            for(int msk1 = 0; msk1 < (1<<v.size()); msk1++){
                int msk2 = msk;
                for(int i = 0; i < v.size(); i++){
                    if((msk1>>i) & 1){
                        msk2 |= (1<<v[i]);
                    }
                }
                if(__builtin_popcount(msk1) % 2 == 1) ans -= dp[msk2];
                else ans += dp[msk2];
            }
            cout<<ans<<'\n';
        }
        else{
            int msk = 0;
            vector<int>v;
            for(int i = 0; i < L; i++){
                if(t[i] == '0') msk |= (1<<i) ;
                else if(t[i] == '1') v.pb(i);
            }
            int ans = 0;
            for(int msk1 = 0; msk1 < (1<<v.size()); msk1++){
                int msk2 = msk;
                for(int i = 0; i < v.size(); i++){
                    if((msk1>>i) & 1){
                        msk2 |= (1<<v[i]);
                    }
                }
                if(__builtin_popcount(msk1) % 2 == 1) ans -= dp1[msk2];
                else ans += dp1[msk2];
            }
            cout<<ans<<'\n';
        }
    }
}
signed main(){
    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    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...