제출 #1181051

#제출 시각아이디문제언어결과실행 시간메모리
1181051AdamGSSnake Escaping (JOI18_snake_escaping)C++17
100 / 100
1173 ms21788 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int LIM=1<<20; int T[LIM], dp0[LIM], dp1[LIM]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, q, l; cin >> l >> q; n=1<<l; string s; cin >> s; rep(i, n) dp0[i]=dp1[i]=T[i]=s[i]-'0'; rep(i, l) rep(j, n) if(j&(1<<i)) dp1[j]+=dp1[j^(1<<i)]; else dp0[j]+=dp0[j^(1<<i)]; while(q--) { string p; cin >> p; reverse(all(p)); vector<int>A, B, C; rep(i, l) if(p[i]=='0') A.pb(i); else if(p[i]=='1') B.pb(i); else C.pb(i); int mask=0; rep(i, B.size()) mask|=1<<B[i]; if((int)C.size()<=6) { int ans=0; rep(i, 1<<C.size()) { int mask2=mask; rep(j, C.size()) if(i&(1<<j)) mask2|=1<<C[j]; ans+=T[mask2]; } cout << ans << '\n'; } else if((int)A.size()<=6) { int ans=0; rep(i, 1<<A.size()) { int mask2=mask; rep(j, A.size()) if(i&(1<<j)) mask2|=1<<A[j]; if(__builtin_popcount(i)%2==0) ans+=dp0[mask2]; else ans-=dp0[mask2]; } cout << ans << '\n'; } else { int ans=0; mask=0; rep(i, C.size()) mask|=1<<C[i]; rep(i, 1<<B.size()) { int mask2=mask; rep(j, B.size()) if(!(i&(1<<j))) mask2|=1<<B[j]; if(__builtin_popcount(i)%2==0) ans+=dp1[mask2]; else ans-=dp1[mask2]; } cout << ans << '\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...