Submission #1123895

#TimeUsernameProblemLanguageResultExecution timeMemory
1123895fgdsaSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1511 ms34248 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int MAXN = 20; ll sup[1<<MAXN]; ll sub[1<<MAXN]; ll init[1<<MAXN]; void brut(string & s, vector<int> & poz){ ll res = 0; ll initMask = 0; for(int i = 0; i < s.size(); ++i){ if(s[i] == '1') initMask ^= (1<<i); } for(int i = 0; i < (1<<poz.size()); ++i){ ll curMask = initMask; for(int j = 0; j < poz.size(); ++j){ if(i & (1<<j)) curMask |= (1<<poz[j]); } res += init[curMask]; } cout << res << '\n'; } void pier0(string & s, vector<int> & poz){ ll maska = 0; for(int i = 0; i < s.size(); ++i){ if(s[i] == '1') maska |= (1<<i); } ll res = 0; for(int i = 0; i < (1<<poz.size()); ++i){ ll curMaska = maska; ll cnt = 0; for(int j = 0; j < poz.size(); ++j){ if(i & (1 << j)) curMaska |= (1<<poz[j]), ++cnt; } res += sup[curMaska]*(cnt % 2 == 0 ? 1 : -1); } cout << abs(res) << "\n"; } void pier1(string & s, vector<int> & poz){ ll maska = 0; for(int i = 0; i < s.size(); ++i){ if(s[i] == '?') maska |= (1<<i); } ll res = 0; for(int i = 0; i < (1<<poz.size()); ++i){ ll curMaska = maska; ll cnt = 0; for(int j = 0; j < poz.size(); ++j){ if(i & (1 << j)) curMaska |= (1<<poz[j]), ++cnt; } res += sub[curMaska]*((cnt % 2) ? -1 : 1); } cout << abs(res) << "\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; string s; cin >> s; for(int i = 0; i < (1<<n); ++i) sup[i] = sub[i] = init[i] = (s[i] - '0'); for(int i = 0; i < n; ++i){ for(int j = 0; j < (1<<n); ++j){ if(j & (1<<i)){ sub[j] += sub[j ^ (1<<i)]; } else{ sup[j] += sup[j ^ (1<<i)]; } } } // for(int i = 0; i < (1<<n); ++i) cerr << i << ": " << sup[i] << "\n"; for(int i = 0; i < q; ++i){ string s2; cin >> s2; reverse(s2.begin(), s2.end()); vector<int> jed, zer, pyt; for(int j = 0; j < s2.size(); ++j){ if(s2[j] == '1') jed.push_back(j); if(s2[j] == '0') zer.push_back(j); if(s2[j] == '?') pyt.push_back(j); } if(pyt.size() <= n/3) brut(s2, pyt); else if(zer.size() <= n/3) pier0(s2, zer); else pier1(s2, jed); } 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...