Submission #703109

#TimeUsernameProblemLanguageResultExecution timeMemory
703109AmirAli_H1Snake Escaping (JOI18_snake_escaping)C++17
100 / 100
826 ms26340 KiB
// In the name of Allah

#include <bits/stdc++.h>
using namespace std;

typedef long long int	ll;
typedef long double	ld;
typedef pair<int, int>	pii;
typedef pair<ll, ll>	pll;

#define all(x)		(x).begin(),(x).end()
#define len(x)		((ll) (x).size())
#define F		first
#define S		second
#define pb		push_back
#define sep             ' '
#define endl            '\n'
#define Mp		make_pair
#define debug(x)	cerr << #x << ": " <<  x << endl;
#define kill(x)		cout << x << '\n', exit(0);
#define set_dec(x)	cout << fixed << setprecision(x);
#define file_io(x,y)	freopen(x, "r", stdin); freopen(y, "w", stdout);

int n, k, q;
const int maxk = 20;
const int maxn = (1 << 20) + 3;
string s;
int a[maxn];
int dp1[maxn], dp2[maxn];

int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	
	cin >> k >> q;
	n = (1 << k);
	cin >> s;
	for (int i = 0; i < n; i++) {
		a[i] = s[i] - '0';
	}
	
	for (int i = 0; i <= k; i++) {
		for (int mask = n - 1; mask >= 0; mask--) {
			if (i == 0) {
				dp1[mask] = a[mask];
				continue;
			}
			
			if (mask & (1 << (i - 1))) dp1[mask] += dp1[mask ^ (1 << (i - 1))];
		}
	}
	
	for (int i = 0; i <= k; i++) {
		for (int mask = 0; mask < n; mask++) {
			if (i == 0) {
				dp2[mask] = a[mask];
				continue;
			}
			
			if (!(mask & (1 << (i - 1)))) dp2[mask] += dp2[mask ^ (1 << (i - 1))];
		}
	}
	
	while (q--) {
		cin >> s;
		int t0 = 0, t1 = 0, t2 = 0;
		int val0 = 0, val1 = 0, val2 = 0;
		for (int i = 0; i < k; i++) {
			if (s[i] == '0') {
				t0++;
				val0 += (1 << (k - i - 1));
			}
			else if (s[i] == '1') {
				t1++;
				val1 += (1 << (k - i - 1));
			}
			else {
				t2++;
				val2 += (1 << (k - i - 1));
			}
		}
		
		int tm = min(min(t0, t1), t2);
		ll output = 0;
		if (tm == t0) {
			for (int mask = val0; mask >= 0; mask = (mask - 1) & val0) {
				int t = __builtin_popcount(mask);
				if (t % 2 == 0) output += dp2[val1 ^ mask];
				else output -= dp2[val1 ^ mask];
				
				if (mask == 0) break;
			}
		}
		else if (tm == t1) {
			for (int mask = val1; mask >= 0; mask = (mask - 1) & val1) {
				int t = __builtin_popcount(mask);
				if (t % 2 == 0) output += dp1[val2 ^ (val1 ^ mask)];
				else output -= dp1[val2 ^ (val1 ^ mask)];
				
				if (mask == 0) break;
			}
		}
		else {
			for (int mask = val2; mask >= 0; mask = (mask - 1) & val2) {
				output += a[val1 ^ mask];
				if (mask == 0) break;
			}
		}
		cout << output << endl;
	}
	
	return 0;
}
#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...