Submission #334278

#TimeUsernameProblemLanguageResultExecution timeMemory
334278ChrisTSnake Escaping (JOI18_snake_escaping)C++17
100 / 100
1865 ms65536 KiB
#include <bits/stdc++.h> using namespace std; int val[1 << 20], sum1[1 << 20], sum2[1 << 20], nmask[1 << 6]; vector<int> pre[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)]; } } for (int mask = 0; mask < (1 << n); mask++) if (__builtin_popcount(mask) <= n/3) { vector<int> pos; for (int i = 0; i < n; i++) if (mask >> i & 1) pos.push_back(i); for (int mask2 = 0; mask2 < (1 << (int)pos.size()); mask2++) { int nmask = 0; for (int i = 0; i < (int)pos.size(); i++) if (mask2 >> i & 1) nmask |= (1 << pos[i]); pre[mask].push_back(nmask); } } 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 int mask = 0, ret = 0, mask2 = 0; for (int i = 0; i < n; i++) { if (str[i] == '?') mask2 |= (1<<i); mask |= (str[i] == '1') << i; } for (int xormask : pre[mask2]) { ret += val[mask ^ xormask]; } printf ("%d\n",ret); } else if (cnt0 <= cnt1) { //PIE int mask = 0, ret = 0, mask2 = 0; for (int i = 0; i < n; i++) { if (str[i] == '0') mask2 |= (1 << i); mask |= (str[i] != '1') << i; } for (int xormask : pre[mask2]) { ret += (__builtin_popcount(xormask) & 1 ? -1 : 1) * sum2[mask ^ xormask]; } printf ("%d\n",ret); } else { //'' '' int mask = 0, ret = 0, mask2 = 0; for (int i = 0; i < n; i++) { if (str[i] == '1') mask2 |= (1 << i); mask |= (str[i] != '0') << i; } for (int xormask : pre[mask2]) { ret += (__builtin_popcount(xormask) & 1 ? -1 : 1) * sum1[mask ^ xormask]; } printf ("%d\n",ret); } } return 0; }

Compilation message (stderr)

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