#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> ii;
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x.size())
#define MASK(i) (1ll << i)
#define debug cout << "[Debug line] " << __LINE__ << ": "
const int N = 20;
const int M = 2e3 + 5;
const int INF = INT_MAX;
int L, q;
string s;
int a[MASK(N) + 5], f[MASK(N) + 5];
void solve() {
cin >> L >> q >> s;
for (int i = 0; i < sz(s); i++) {
f[i] = a[i] = s[i] - '0';
}
int full = MASK(L) - 1;
for (int i = 0; i < L; i++) {
for (int mask = 0; mask <= full; mask++) {
if (!(mask >> i & 1)) {
f[mask] += f[mask ^ MASK(i)];
}
}
}
for (int i = 1; i <= q; i++) {
string T; cin >> T;
int mask0, mask1, maskQues;
mask0 = mask1 = maskQues = 0;
int c0, cQ;
c0 = cQ = 0;
for (int j = L - 1; j >= 0; j--) {
if (T[j] == '0') {
c0++; mask0 += MASK(L - j - 1);
}
else if (T[j] == '1') {
mask1 += MASK(L - j - 1);
}
else {
cQ++; maskQues += MASK(L - j - 1);
}
}
int res = 0;
if (c0 < cQ) {
res = f[mask1];
for (int sub = mask0; sub != 0; sub = (sub - 1) & mask0) {
if (__builtin_popcount(sub) & 1) res -= f[sub | mask1];
else res += f[sub | mask1];
}
}
else {
res = a[mask1];
for (int sub = maskQues; sub != 0; sub = (sub - 1) & maskQues) {
res += a[mask1 | sub];
}
}
cout << res << '\n';
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// #define TASK "PERMATRIX"
// freopen(TASK".inp", "r", stdin);
// freopen(TASK".out", "w", stdout);
int T = 1;
// cin >> T;
while (T--) {
solve();
}
}
| # | 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... |