Submission #1301457

#TimeUsernameProblemLanguageResultExecution timeMemory
1301457KickingKunSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
869 ms31840 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define ld long double #define bigint __int128 #define emb emplace_back #define pb push_back #define pii pair <int, int> #define fi first #define se second #define all(v) v.begin(), v.end() #define Task "" #define MASK(k) (1ull << k) #define bitcnt(k) __builtin_popcount(k) #define testBit(n, k) ((n >> k) & 1) #define flipBit(n, k) (n ^ (1ll << k)) #define offBit(n, k) (n & ~MASK(k)) #define onBit(n, k) (n | (1ll << k)) template <class T> bool minimize(T &a, T b) {if (a > b) {a = b; return true;} return false;} template <class T> bool maximize(T &a, T b) {if (a < b) {a = b; return true;} return false;} const int N = 2e5 + 5, LG = 20, mod = 1e9 + 7; const ll INF = 1e18; int L, q, f[1 << LG], g[1 << LG]; string s; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); if (fopen(Task".inp", "r")) { freopen(Task".inp", "r", stdin); freopen(Task".out", "w", stdout); } cin >> L >> q >> s; for (int i = 0; i < (1 << L); i++) { f[i] = g[((1 << L) - 1) ^ i] = s[i] - 48; } for (int i = 0; i < L; i++) { for (int mask = 0; mask < (1 << L); mask++) if (testBit(mask, i)) { f[mask] += f[mask ^ (1 << i)]; g[mask] += g[mask ^ (1 << i)]; } } while (q--) { string pattern; cin >> pattern; int c0 = count(all(pattern), '0'); int c1 = count(all(pattern), '1'); int unk = L - c0 - c1; if (unk <= 6) { vector <int> pos; int initValue = 0; for (int i = 0; i < L; i++) { if (pattern[L - i - 1] == '?') pos.emplace_back(i); else initValue += (pattern[L - i - 1] - 48) * (1 << i); } int ans = 0; for (int mask = 0; mask < (1 << unk); mask++) { int value = initValue; for (int i = 0; i < unk; i++) value += testBit(mask, i) * (1 << pos[i]); ans += s[value] - 48; } cout << ans << '\n'; } else if (c1 <= 6) { // pattern[i] = 0 -> mask[i] = 1 -> ko lien quan // moi mask se duoc anh huong 2^k lan // k = so vi tri mask[i] = 0 ma pattern[i] = 1 // do la nhung lan T[i] = 1 khi mask[i] = pattern[i] = 1 // va T[i] = 0/1 khi mask[i] = 0 va pattern[i] = 1 vector <int> S1; int ques = 0; for (int i = 0; i < L; i++) { if (pattern[L - i - 1] == '1') S1.emplace_back(i); if (pattern[L - i - 1] == '?') ques += 1 << i; } int ans = 0; for (int m = 0; m < (1 << c1); m++) { int T = 0; for (int i = 0; i < c1; i++) if (testBit(m, i)) T += 1 << S1[i]; if ((bitcnt(m) + c1) & 1) ans -= f[T | ques]; else ans += f[T | ques]; } cout << ans << '\n'; } else { // flip 0 -> 1 vector <int> S0; int ques = 0; for (int i = 0; i < L; i++) { if (pattern[L - i - 1] == '0') S0.emplace_back(i); if (pattern[L - i - 1] == '?') ques += 1 << i; } int ans = 0; for (int m = 0; m < (1 << c0); m++) { int T = 0; for (int i = 0; i < c0; i++) if (testBit(m, i)) T += 1 << S0[i]; if ((bitcnt(m) + c0) & 1) ans -= g[T | ques]; else ans += g[T | ques]; } cout << ans << '\n'; } } }

Compilation message (stderr)

snake_escaping.cpp: In function 'int main()':
snake_escaping.cpp:36:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   36 |                 freopen(Task".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
snake_escaping.cpp:37:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |                 freopen(Task".out", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...