제출 #334278

#제출 시각아이디문제언어결과실행 시간메모리
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;
}

컴파일 시 표준 에러 (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...