Submission #853890

#TimeUsernameProblemLanguageResultExecution timeMemory
853890willychanSnake Escaping (JOI18_snake_escaping)C++14
100 / 100
1030 ms43252 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; //#include<bits/extc++.h> //__gnu_pbds int main(){ ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0); int n,q;cin>>n>>q; vector<int> normal(1<<n); vector<int> sum1(1<<n); vector<int> sum0(1<<n); string s;cin>>s; for(int i=0;i<(1<<n);i++){ normal[i] = s[i]-'0'; sum1[i]=normal[i]; sum0[i]=normal[i]; } for(int j=0;j<n;j++){ for(int i=0;i<(1<<n);i++){ if((i>>j)&1) sum1[i]+=sum1[i^(1<<j)]; } } for(int j=0;j<n;j++){ for(int i=(1<<n)-1;i>=0;i--){ if(!((i>>j)&1)) sum0[i]+=sum0[i^(1<<j)]; } } while(q--){ string qs;cin>>qs; int cnt0=0; int cnt1=0; int cntq=0; for(int i=0;i<n;i++){ cnt0+=(qs[i]=='0'); cnt1+=(qs[i]=='1'); cntq+=(qs[i]=='?'); } if(cnt0<=cnt1 && cnt0<=cntq){ int calc = 0; vector<int> b; for(int i=0;i<n;i++){ if(qs[i]=='1') calc+=(1<<(n-1-i)); if(qs[i]=='0') b.push_back(i); } int ans = 0; for(int mask=0;mask<(1<<cnt0);mask++){ int f = calc; int cntbit=0; for(int i=0;i<cnt0;i++) if((mask>>i)&1){f+=(1<<(n-1-b[i]));cntbit++;} ans+=(((cntbit)&1)?(-1):(1))*sum0[f]; } cout<<ans<<"\n"; continue; } if(cnt1<=cnt0 && cnt1<=cntq){ int calc = 0; vector<int> b; for(int i=0;i<n;i++){ if(qs[i]=='?') calc+=(1<<(n-1-i)); if(qs[i]=='1') b.push_back(i); } int ans = 0; for(int mask=0;mask<(1<<cnt1);mask++){ int f = calc; int cntbit=0; for(int i=0;i<cnt1;i++) if((mask>>i)&1){f+=(1<<(n-1-b[i]));cntbit++;} ans+=(((cnt1^cntbit)&1)?(-1):(1))*sum1[f]; } cout<<ans<<"\n"; continue; } if(cntq<=cnt1 && cntq<=cnt0){ int calc = 0; vector<int> b; for(int i=0;i<n;i++){ if(qs[i]=='1') calc+=(1<<(n-1-i)); if(qs[i]=='?') b.push_back(i); } int ans = 0; for(int mask=0;mask<(1<<cntq);mask++){ int f = calc; for(int i=0;i<cntq;i++) if((mask>>i)&1) f+=(1<<(n-1-b[i])); ans+=normal[f]; } cout<<ans<<"\n"; continue; } } 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...