제출 #877159

#제출 시각아이디문제언어결과실행 시간메모리
877159OAleksaSnake Escaping (JOI18_snake_escaping)C++14
22 / 100
1043 ms41968 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
const int maxn = 21;
int a[1 << maxn], cnt[1 << maxn], n, q, cnt1[1 << maxn];
string s;
signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
   int tt = 1;
  	//cin >> tt;
   while (tt--) {
   	cin >> n >> q >> s;
   	for (int i = 0;i < (1 << n);i++) 
   		cnt[i] = cnt1[i] = (s[i] - '0');
   	for (int i = 0;i < n;i++) {
   		for (int mask = 0;mask < (1 << n);mask++) {
   			if (mask & (1 << i))
   				cnt[mask] += cnt[mask ^ (1 << i)];
   		}
   		for (int mask = (1 << n) - 1;mask >= 0;mask--) {
   			if (!(mask & (1 << i)))
   				cnt1[mask] += cnt1[mask ^ (1 << i)];
   		}
   	}
   	
   	while (q--) {
   		string t;
   		cin >> t;
   		reverse(t.begin(), t.end());
   		vector<int> a, b, c;
   		int x = 0;
   		for (int i = 0;i < n;i++) {
   			x += (t[i] == '1' ? (1 << i) : 0);
   			if (t[i] == '1')
   				a.push_back(i);
   			else if (t[i] == '0')
   				b.push_back(i);
   			else
   				c.push_back(i);
   		}
   		int ans = 0;
   		if (c.size() <= 6) {
   			for (int mask = 0;mask < (1 << (int)c.size());mask++) {
   				int y = x;
   				for (int j = 0;j < (int)c.size();j++) {
   					if (mask & (1 << j))
   						y |= (1 << c[j]);
   				}
   				ans += (s[y] - '0');
   			}
   		}
   		else if (a.size() <= 6) {
   			int tx = x;
   			for (int i = 0;i < n;i++)
   				tx += (t[i] == '?' ? (1 << i) : 0);
   			for (int mask = 0;mask < (1 << (int)a.size());mask++) {
   				int y = tx;
   				for (int j = 0;j < (int)a.size();j++) {
   					if (mask & (1 << j))
   						y -= (1 << a[j]);
   				}
   				ans += cnt[y] * (__builtin_popcount(mask) % 2 == 0 ? 1 : -1);
   			}
   		}
   		else {
   			for (int mask = 0;mask < (1 << (int)a.size());mask++) {
   				int y = x;
   				for (int j = 0;j < (int)a.size();j++) {
   					if (mask & (1 << j))
   						y += (1 << b[j]);
   				}
   				ans += cnt1[y] * (__builtin_popcount(mask) % 2 == 0 ? 1 : -1);
   			}
   		}
   		cout << ans << "\n";
   	}
	}
	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...