Submission #64590

#TimeUsernameProblemLanguageResultExecution timeMemory
64590keko37Snake Escaping (JOI18_snake_escaping)C++14
100 / 100
1944 ms51616 KiB
#include<iostream>
#include<cstdio>

using namespace std;

const int MAXN = (1<<20) + 5;

int n, q, a, b, c, sol, mask, N, rev, count, i, j, tc;
char ss[MAXN];
char l[30], cc;
int val[MAXN], sum0[MAXN], sum1[MAXN], pc[MAXN];

int main () {
	scanf("%d%d", &n, &q);
	scanf("%s", ss);
	for (i=0; i<(1<<n); i++) {
		val[i] = ss[i] - '0';
		pc[i] = pc[i - (i&-i)]+1;
		sum0[i] = val[i];
	}
	for (int i=0; i<(1<<n); i++) {
		sum1[i] = val[i ^ ((1<<n) - 1)];
	}
	for (i=0; i<n; i++) {
		for (j=0; j<(1<<n); j++) {
			if (j & (1<<i)) sum0[j] += sum0[j ^ (1<<i)];
			if (j & (1<<i)) sum1[j] += sum1[j ^ (1<<i)];
		}
	}
	for (tc=0; tc<q; tc++) {
		a = b = c = 0;
		do {
			cc = getchar();
		} while (!(cc=='0' || cc=='1' || cc=='?'));
		for (i=0; i<n; i++) {
			if (i>0) cc = getchar();
			l[i] = cc;
			if (l[i] == '?') {
				a ^= (1<<(n-1-i));
			} else if (l[i] == '0') {
				b ^= (1<<(n-1-i));
			} else {
				c ^= (1<<(n-1-i));
			}
		}
		sol = 0;
		if (pc[a] <= pc[b] && pc[a] <= pc[c]) {
			for (mask = a; ; mask = (mask - 1) & a) {
				sol += val[mask | c];
				if (!mask) break;
			}
		} else if (pc[b] <= pc[a] && pc[b] <= pc[c]) {
			for (mask = b; ; mask = (mask-1) & b) {
				rev = mask | a;
				if (pc[rev] & 1) {
					sol -= sum1[rev];
				} else {
					sol += sum1[rev];
				}
				if (!mask) break;
			}
			if (sol < 0) sol = -sol;
		} else {
			for (mask = c; ; mask = (mask - 1) & c) {
				rev = mask | a;
				if (pc[rev] & 1) {
					sol -= sum0[rev];
				} else {
					sol += sum0[rev];
				}
				if (!mask) break;
			}
			if (sol < 0) sol = -sol;
		}
		printf("%d\n", sol);
	}
	return 0;
}

Compilation message (stderr)

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