Submission #1271444

#TimeUsernameProblemLanguageResultExecution timeMemory
1271444ZeroCoolSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
886 ms43284 KiB
#include <bits/stdc++.h> using namespace std;; #define ll long long #define ar array #define ld long double #define int long long #define all(v) v.begin(), v.end() // #pragma GCC optimize("O3,Ofast,unroll-loops ") const int N = 5e5 + 20; const int M = 20; const int LOG = 20; const int INF = 1e17; int MOD = 1e9 + 7; const ld EPS = 1e-12; template<typename T> inline void chmin(T &x,T y){x = min(x, y);} template<typename T> inline void chmax(T &x,T y){x = max(x, y);} inline void mm(int &x){x = (x % MOD + MOD) % MOD;}; struct DSU{ vector<int> p, sz; int sum1, sum2; vector<pair<int&,int>>U; void init(int n){ p.resize(n); sz.resize(n, 1); iota(all(p), 0); sum1 = n; sum2 = n; } int fnd(int x){ if(p[x] == x)return x; return fnd(p[x]); } bool upd(int a,int b){ a = fnd(a); b = fnd(b); if(a == b)return 0; if(sz[a] > sz[b])swap(a, b); U.push_back({sum1, sum1}); U.push_back({sum2, sum2}); U.push_back({p[a], p[a]}); U.push_back({sz[b], sz[b]}); sum1 -= sz[a]; sum1 -= sz[b]; sum2 -= sz[a] * sz[a]; sum2 -= sz[b] * sz[b]; p[a] = b; sz[b] += sz[a]; sum1 += sz[b]; sum2 += sz[b] * sz[b]; return 1; } int getTime(){ return U.size(); } void roll(int x){ while(U.size() > x){ U.back().first = U.back().second; U.pop_back(); } } int qry(int x){ x = fnd(x); return sz[x]; } }; void orz(){ int n; int q; cin>>n; cin>>q; string s; cin>>s; int pref[(1 << n)]; int suff[(1 << n)]; for(int i = 0;i < (1 << n);i++){ pref[i] = suff[i] = s[i] - '0'; } for(int j = 0;j < n;j++){ for(int x = 0;x < (1 << n);x++){ if((1 << j) & x){ pref[x] += pref[x ^ (1 << j)]; suff[x ^ (1 << j)] += suff[x]; } } } // assert(0); while(q--){ string t; cin>>t; int cnt[3] = {0}; for(auto u: t){ if(u == '0')cnt[0]++; else if(u == '1')cnt[1]++; else cnt[2]++; } if(cnt[2] <= 6){ vector<int> p; int x = 0; for(int i = 0;i < n;i++){ int b = n - i - 1; if(t[i] == '1')x += (1 << b); else if(t[i] == '?')p.push_back((1 << b)); } int ans = 0; for(int i = 0;i < (1 << p.size());i++){ int xx = x; for(int j = 0;j < p.size();j++){ if((1 << j) & i)xx += p[j]; } ans += s[xx] - '0'; } cout<<ans<<'\n'; }else if(cnt[0] <= 6){ vector<int> p; int x = 0; for(int i = 0;i < n;i++){ int b = n - i - 1; if(t[i] == '1')x += (1 << b); else if(t[i] == '0')p.push_back((1 << b)); } int ans = 0; for(int i = 0;i < (1 << p.size());i++){ int xx = x; for(int j = 0;j < p.size();j++){ if((1 << j) & i)xx += p[j]; } ans += (__builtin_parity(i) ? suff[xx] : -suff[xx]); } cout<<abs(ans)<<'\n'; }else{ vector<int> p; int x = 0; for(int i = 0;i < n;i++){ int b = n - i - 1; if(t[i] == '0')continue; x += (1 << b); if(t[i] == '1')p.push_back(-(1 << b)); } int ans = 0; for(int i = 0;i < (1 << p.size());i++){ int xx = x; for(int j = 0;j < p.size();j++){ if((1 << j) & i)xx += p[j]; } ans += (__builtin_parity(i) ? pref[xx] : -pref[xx]); } cout<<abs(ans)<<'\n'; } } } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; // cin>>t; while (t--)orz(); }
#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...