#include <bits/stdc++.h>
using namespace std;
#define For(i, a, b, x) for (int i = (a); i <= (b); i += (x))
#define Ford(i, a, b, x) for (int i = (a); i >= (b); i -= (x))
typedef pair<int, int> pii;
long long n, q, ans, a[(1 << 22) + 5], dp1[(1 << 22) + 5], dp2[(1 << 22) + 5], one, zero, question, bitO, bitZ, bitQ;
string s;
char x;
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// freopen("voi.inp", "r", stdin);
// freopen("voi.out", "w", stdout);
cin >> n >> q;
For(i, 0, (1 << n) - 1, 1){
cin >> x;
a[i] = dp1[i] = dp2[i] = x - '0';
}
For(i, 0, n - 1, 1){
For(mask, 0, (1 << n) - 1, 1){
if ((mask >> i) & 1) dp1[mask] += dp1[mask ^ (1 << i)];
}
}
For(i, 0, n - 1, 1){
For(mask, 0, (1 << n) - 1, 1){
if (!((mask >> i) & 1)) dp2[mask] += dp2[mask | (1 << i)];
}
}
For(i, 1, q, 1){
cin >> s;
reverse(s.begin(), s.end());
one = zero = question = ans = 0;
For(j, 0, s.size() - 1, 1){
if (s[j] == '1') one |= (1 << j);
if (s[j] == '0') zero |= (1 << j);
if (s[j] == '?') question |= (1 << j);
}
bitO = __builtin_popcount(one);
bitZ = __builtin_popcount(zero);
bitQ = __builtin_popcount(question);
if (bitQ <= 6) {
ans = a[one];
for (int sub = question; sub > 0; sub = (sub - 1) & question) ans += a[sub | one];
}else if (bitO <= 6) {
ans = dp1[question] * ((bitO & 1) ? -1 : 1);
for (int sub = one; sub > 0; sub = (sub - 1) & one){
if ((__builtin_popcount(sub) & 1) != (bitO & 1)) ans -= dp1[sub | question];
else ans += dp1[sub | question];
}
}else if (bitZ <= 6) {
ans = dp2[one];
for (int sub = zero; sub > 0; sub = (sub - 1) & zero){
if ((__builtin_popcount(sub) & 1)) ans -= dp2[sub | one];
else ans += dp2[sub | one];
}
}
cout << ans << '\n';
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |