Submission #334264

#TimeUsernameProblemLanguageResultExecution timeMemory
334264ChrisTSnake Escaping (JOI18_snake_escaping)C++17
75 / 100
2033 ms42476 KiB
#include <bits/stdc++.h> using namespace std; int val[1 << 20], sum1[1 << 20], sum2[1 << 20]; char str[25]; int main() { //nut int n,q; scanf ("%d %d",&n,&q); for (int i = 0; i < (1 << n); i++) { char ch; scanf (" %c",&ch); sum2[((1 << n) - 1) ^ i] = sum1[i] = val[i] = ch - '0'; } for (int i = 0; i < n; i++) { for (int mask = 0; mask < (1 << n); mask++) if (mask >> i & 1) { sum1[mask] += sum1[mask ^ (1 << i)]; sum2[mask] += sum2[mask ^ (1 << i)]; } } while (q--) { scanf ("%s",str); reverse(str,str+n); int cnt0 = 0, cnt1 = 0, cntq = 0; for (int i = 0; i < n; i++) { if (str[i] == '0') ++cnt0; else if (str[i] == '1') ++cnt1; else ++cntq; } if (cntq <= cnt0 && cntq <= cnt1) { //brute force ?s vector<int> pos; pos.reserve(cntq); int mask = 0, ret = 0; for (int i = 0; i < n; i++) { if (str[i] == '?') pos.push_back(i); mask |= (str[i] == '1') << i; } vector<int> nmask(1 << cntq); nmask[0] = mask; for (int qmask = 0; qmask < (1 << cntq); qmask++) { if (qmask) { int bit = __builtin_ctz(qmask); nmask[qmask] = nmask[qmask ^ (1 << bit)] | (1 << pos[bit]); } ret += val[nmask[qmask]]; } printf ("%d\n",ret); } else if (cnt0 <= cnt1) { //PIE vector<int> pos; pos.reserve(cnt0); int mask = 0, ret = 0; for (int i = 0; i < n; i++) { if (str[i] == '0') pos.push_back(i); mask |= (str[i] != '1') << i; } vector<int> nmask(1 << cnt0); nmask[0] = mask; for (int mask0 = 0; mask0 < (1 << cnt0); mask0++) { if (mask0) { int bit = __builtin_ctz(mask0); nmask[mask0] = nmask[mask0 ^ (1 << bit)] ^ (1 << pos[bit]); } ret += (__builtin_popcount(mask0) & 1 ? -1 : 1) * sum2[nmask[mask0]]; } printf ("%d\n",ret); } else { //'' '' vector<int> pos; pos.reserve(cnt1); int mask = 0, ret = 0; for (int i = 0; i < n; i++) { if (str[i] == '1') pos.push_back(i); mask |= (str[i] != '0') << i; } vector<int> nmask(1 << cnt1); nmask[0] = mask; for (int mask1 = 0; mask1 < (1 << cnt1); mask1++) { if (mask1) { int bit = __builtin_ctz(mask1); nmask[mask1] = nmask[mask1 ^ (1 << bit)] ^ (1 << pos[bit]); } ret += (__builtin_popcount(mask1) & 1 ? -1 : 1) * sum1[nmask[mask1]]; } printf ("%d\n",ret); } } return 0; }

Compilation message (stderr)

snake_escaping.cpp: In function 'int main()':
snake_escaping.cpp:7:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    7 |  scanf ("%d %d",&n,&q);
      |  ~~~~~~^~~~~~~~~~~~~~~
snake_escaping.cpp:9:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    9 |   char ch; scanf (" %c",&ch);
      |            ~~~~~~^~~~~~~~~~~
snake_escaping.cpp:19:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   19 |   scanf ("%s",str);
      |   ~~~~~~^~~~~~~~~~
#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...