Submission #958752

#TimeUsernameProblemLanguageResultExecution timeMemory
958752TAhmed33Snake Escaping (JOI18_snake_escaping)C++98
75 / 100
2001 ms47608 KiB
#include <bits/stdc++.h>
using namespace std;
const int B = 20;
int dp[2][1 << B], dq[2][1 << B], arr[1 << B];
int n, q;
int main () {
	cin >> n >> q;
	for (int i = 0; i < (1 << n); i++) {
		char s; cin >> s; int x = s - '0';
		arr[i] = x;
		dp[1][i] = dq[1][i] = x;
	}
	for (int i = 0, c = 0; i < n; i++, c ^= 1) {
		for (int j = 0; j < (1 << n); j++) {
			dp[c][j] = dp[c ^ 1][j];
			if (j & (1 << i)) dp[c][j] += dp[c ^ 1][j ^ (1 << i)];
			dq[c][j] = dq[c ^ 1][j];
			if (!(j & (1 << i))) dq[c][j] += dq[c ^ 1][j ^ (1 << i)];
		}
	}
	int ll = (n - 1) & 1;
	while (q--) {
		string s; cin >> s;
		int a = 0, b = 0, c = 0;
		for (int i = 0; i < n; i++) {
			if (s[i] == '0') {
				a ^= 1 << (n - i - 1);
			} else if (s[i] == '1') {
				b ^= 1 << (n - i - 1);
			} else {
				c ^= 1 << (n - i - 1);
			}
		}
		int ret = 0;
		if (__builtin_popcount(a) <= 6) {
			int m = a;
			while (true) {
				assert(0 <= m && m < (1 << n));
				if (__builtin_popcount(m) & 1) {
					ret -= dq[ll][b | m];
				} else {
					ret += dq[ll][b | m];
				}
				if (m == 0) break;
				m = (m - 1) & a;
			}
		} else if (__builtin_popcount(b) <= 6) {
			int m = b;
			while (true) {
				if (__builtin_popcount(m) & 1) {
					ret -= dp[ll][c | m];
				} else {
					ret += dp[ll][c | m];
				}
				if (m == 0) break;
				m = (m - 1) & b;
			} 
		} else {
			int m = c;
			while (true) {
				ret += arr[b ^ m];
				if (m == 0) break;
				m = (m - 1) & c;
			} 
		}
		cout << (ret < 0 ? -ret : ret) << '\n';
	}
}
#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...