제출 #1369531

#제출 시각아이디문제언어결과실행 시간메모리
1369531nambanana987Snake Escaping (JOI18_snake_escaping)C++20
100 / 100
669 ms17764 KiB
#include <bits/stdc++.h>
#include <climits>
using namespace std;
#define f first
#define s second
#define all(a) a.begin(),a.end()
#define sz(a) (int)a.size()
using ll=long long;
int l,q;
string s;
const int N=(1<<20)+5;
int dp_super[N],dp_sub[N];
void solve(){
    cin>>l>>q>>s;
    for(int i=0;i<(1<<l);++i){
        dp_super[i]=dp_sub[i]=s[i]-'0';
    }
    for(int i=0;i<l;++i){
        for(int mask=0;mask<(1<<l);++mask){
            if(mask&(1<<i)) dp_sub[mask]+=dp_sub[mask^(1<<i)];
            else dp_super[mask]+=dp_super[mask^(1<<i)];
        }
    }
    while(q--){
        string in;cin>>in;
        int base=0;
        int cntquest=0,cnt0=0,cnt1=0;
        reverse(all(in));
        for(char i:in){
            if(i=='?'){
                ++cntquest;
            }
            else if(i=='0') cnt0++;
            else ++cnt1;
        }
        int ans=0;
        int mi=min({cnt0,cnt1,cntquest});
        if(cntquest==mi){
            vector<int>pos;
            for(int i=0;i<sz(in);++i){
                if(in[i]=='?') pos.push_back(i);
                if(in[i]=='1') base|=1<<i;
            }
            for(int mask=0;mask<(1<<cntquest);++mask){
                int temp=base;
                for(int i=0;i<cntquest;++i){
                    if(mask&(1<<i)) temp|=1<<pos[i];
                }
                ans+=s[temp]-'0';
            }
        }
        
        else if(cnt1==mi){
            vector<int>pos;
            for(int i=0;i<sz(in);++i){
                if(in[i]=='1'){
                    pos.push_back(i);
                    base|=1<<i;
                }
                if(in[i]=='?') base|=1<<i;
            }
            for(int mask=0;mask<(1<<cnt1);++mask){
                int temp=base;
                int cnt=0;
                for(int i=0;i<cnt1;++i){
                    if(mask&(1<<i)) {
                        temp^=1<<pos[i];
                        ++cnt;
                    }
                }
                if(cnt&1) ans-=dp_sub[temp];
                else ans+=dp_sub[temp];
            }
        }
        else{
            vector<int>pos;
            for(int i=0;i<sz(in);++i){
                if(in[i]=='0'){
                    pos.push_back(i);
                }
                if(in[i]=='1') base|=1<<i;
            }
            for(int mask=0;mask<(1<<cnt0);++mask){
                int temp=base;
                int cnt=0;
                for(int i=0;i<cnt0;++i){
                    if(mask&(1<<i)) {
                        temp^=1<<pos[i];
                        ++cnt;
                    }
                }
                if(cnt&1) ans-=dp_super[temp];
                else ans+=dp_super[temp];
            }
        }
        cout<<ans<<'\n';
    }
}
signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…