Submission #535318

#TimeUsernameProblemLanguageResultExecution timeMemory
535318amunduzbaevSnake Escaping (JOI18_snake_escaping)C++17
0 / 100
1 ms468 KiB
#include "bits/stdc++.h" using namespace std; #define ar array #define int long long const int N = 20; int dp[2][N][20]; signed main(){ ios::sync_with_stdio(0); cin.tie(0); int n, m; cin>>n>>m; string s; cin>>s; vector<int> a(1 << n); for(int i=0;i<(1 << n);i++) a[i] = s[i] - '0'; //~ for(int i=0;i<(1 << n);i++){ //~ for(int j=0;j<n;j++) cout<<(i >> j & 1); //~ cout<<" : "<<a[i]<<"\n"; //~ } for(int mask=(1 << n) - 1;~mask;mask--){ int res = a[mask]; for(int i=n-1;~i;i--){ if(!(mask >> i & 1)){ res += dp[0][mask | (1 << i)][i]; } dp[0][mask][i] = res; } } for(int mask=0;mask<(1 << n);mask++){ int res = a[mask]; for(int i=n-1;~i;i--){ if(mask >> i & 1){ res += dp[1][mask ^ (1 << i)][i]; } dp[1][mask][i] = res; } } while(m--){ string s; cin>>s; reverse(s.begin(), s.end()); ar<int, 3> c {}; for(int i=0;i<n;i++){ if(s[i] == '0') c[0]++; if(s[i] == '1') c[1]++; if(s[i] == '?') c[2]++; } int res = 0; if(c[2] <= 6){ int in = 0; vector<int> p; for(int i=0;i<n;i++){ if(s[i] == '0' || s[i] == '1') in |= ((s[i] - '0') << i); else p.push_back(i); } for(int mask=0;mask < (1 << c[2]);mask++){ int tot = in; for(int j=0;j<c[2];j++){ if(mask >> j & 1) tot |= (1 << p[j]); } //~ for(int i=0;i<n;i++) cout<<(tot >> i & 1); //~ cout<<" : "; res += a[tot]; //~ cout<<a[tot]<<"\n"; } } else if(c[0] <= 6) { int t = 0, in = 0; vector<int> p; for(int i=0;i<n;i++){ if(s[i] == '1') in |= (1 << i); if(s[i] == '0') p.push_back(i); } for(int mask=0;mask < (1 << c[0]);mask++){ int tot = in; for(int j=0;j<c[0];j++){ if(mask >> j & 1) tot |= (1 << p[j]); } if(__builtin_popcount(mask)&1) res -= dp[t][tot][0]; else res += dp[t][tot][0]; } } else { int t = 1, in = (1 << n) - 1; vector<int> p; for(int i=0;i<n;i++){ if(s[i] == '0') in ^= (1 << i); if(s[i] == '1') p.push_back(i); } for(int mask=0;mask<(1 << c[1]);mask++){ int tot = in; for(int j=0;j<c[1];j++){ if(mask >> j & 1) tot ^= (1 << p[j]); } if(__builtin_popcount(mask)&1) res -= dp[t][tot][0]; else res += dp[t][tot][0]; } } cout<<res<<"\n"; } }
#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...