이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int l, q;
string s;
cin >> l >> q >> s;
int n = (1 << l);
vector<int> sub(n), super(n);
for (int mask = 0; mask < n; ++mask) {
sub[mask] = (s[mask] - '0');
super[mask] = (s[mask] - '0');
}
for (int bit = 0; bit < l; ++bit) {
for (int mask = 0; mask < n; ++mask) {
if (mask & (1 << bit)) {
sub[mask] += sub[mask ^ (1 << bit)];
} else {
super[mask] += super[mask | (1 << bit)];
}
}
}
for (int qq = 0; qq < q; ++qq) {
string t;
cin >> t;
int mask0 = 0, mask1 = 0, maskq = 0;
for (int i = 0; i < l; ++i) {
if (t[i] == '0') {
mask0 |= (1 << (l - i - 1));
} else if (t[i] == '1') {
mask1 |= (1 << (l - i - 1));
} else {
maskq |= (1 << (l - i - 1));
}
}
int sum = 0, mask;
if (__builtin_popcount(maskq) <= l / 3) {
mask = maskq;
while (mask) {
sum += (s[mask1 | mask] - '0');
mask = (mask - 1) & maskq;
}
sum += (s[mask1] - '0');
} else if (__builtin_popcount(mask0) <= l / 3) {
mask = mask0;
while (mask) {
if (__builtin_popcount(mask) % 2 == 0) {
sum += super[mask | mask1];
} else {
sum -= super[mask | mask1];
}
mask = (mask - 1) & mask0;
}
sum += super[mask1];
} else {
int N = __builtin_popcount(mask1);
mask = mask1;
while (mask) {
if ((N - __builtin_popcount(mask)) % 2 == 0) {
sum += sub[mask | maskq];
} else {
sum -= sub[mask | maskq];
}
mask = (mask - 1) & mask1;
}
if (N % 2 == 0) {
sum += sub[maskq];
} else {
sum -= sub[maskq];
}
}
cout << sum << '\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... |