제출 #716750

#제출 시각아이디문제언어결과실행 시간메모리
716750oooSnake Escaping (JOI18_snake_escaping)C++14
100 / 100
1471 ms39192 KiB
#include <bits/stdc++.h> using namespace std; const int nu = (1<<20); int n, query, f[2][nu]; string s; vector<int> cnt0, cnt1, cnt2; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> query >> s; for(int i = 0; i < (1<<n); ++i) f[0][i] = f[1][i] = s[i]-48; for(int i = 0; i < n; ++i) for(int j = 0; j < (1<<n); ++j) if((1<<i)&j) f[0][j] += f[0][j^(1<<i)]; else f[1][j] += f[1][j^(1<<i)]; while(query > 0) { string x; cin >> x; int num0 = 0; int num1 = 0; int num2 = 0; int ans = 0; for(int i = 0; i < int(x.size()); ++i) if(x[i] == '0') cnt0.push_back(n-i-1), num0 += (1<<(n-i-1)); else if(x[i] == '1') cnt1.push_back(n-i-1), num1 += (1<<(n-i-1)); else cnt2.push_back(n-i-1), num2 += (1<<(n-i-1)); if(int(cnt1.size()) <= n/3) { int len = int(cnt1.size()); for(int i = 0; i < (1<<len); ++i) { int num = 0; int d = 0; for(int j = 0; j < len; ++j) if((1<<j)&i) num += (1<<cnt1[j]), d++; if(d&1) ans -= f[0][num|num2]; else ans += f[0][num|num2]; } ans = abs(ans); } else if(int(cnt0.size()) <= n/3) { int len = int(cnt0.size()); for(int i = 0; i < (1<<len); ++i) { int num = 0; int d = 0; for(int j = 0; j < len; ++j) if((1<<j)&i) num += (1<<cnt0[j]), d++; if(d&1) ans -= f[1][num|num1]; else ans += f[1][num|num1]; } ans = abs(ans); } else { int len = int(cnt2.size()); for(int i = 0; i < (1<<len); ++i) { int num = 0; int d = 0; for(int j = 0; j < len; ++j) if((1<<j)&i) num += (1<<cnt2[j]), d++; ans += s[num|num1]-48; } } cout << ans << '\n'; cnt0.clear(); cnt1.clear(); cnt2.clear(); --query; } 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...