This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define all(v) v.begin(), v.end()
typedef long long ll;
int n, q, a[1 << 20], S[1 << 20], T[1 << 20], cnt[2], ans, p;
string s;
void f(int i, int op, int st){
if(i == n){
if(!op) ans += a[st];
else if(op == 1){
if(p & 1) ans -= S[st];
else ans += S[st];
}
else{
if(p & 1) ans -= T[st];
else ans += T[st];
//cout << i << ' ' << st << ' ' << T[st] << ' ' << ans << '\n';
}
return;
}
if(!op){
if(s[i] == '?') {
f(i + 1, op, st);
f(i + 1, op, st | 1 << i);
}
else {
if(s[i] == '1') st |= 1 << i;
f(i + 1, op, st);
}
}
else if(op == 1){
if(s[i] == '1'){
f(i + 1, op, st | 1 << i);
p++;
f(i + 1, op, st);
p--;
}
else{
if(s[i] == '?') st |= 1 << i;
f(i + 1, op, st);
}
}
else{
if(s[i] == '0'){
f(i + 1, op, st);
p++;
f(i + 1, op, st | 1 << i);
p--;
}
else{
if(s[i] == '1') st |= 1 << i;
f(i + 1, op, st);
}
}
return;
}
int main(void){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> q >> s;
for(int i = 0; i < 1 << n; i++) {
a[i] = s[i] - '0';
S[i] = T[i] = a[i];
}
for(int i = 0; i < n; i++)
for(int mask = 0; mask < 1 << n; mask++) {
if(mask & (1 << i)) S[mask] += S[mask ^ (1 << i)];
if(!(mask & (1 << i))) T[mask] += T[mask ^ (1 << i)];
}
while(q--){
cin >> s;
reverse(all(s));
cnt[0] = cnt[1] = 0;
for(int i = 0; i < n; i++){
if(s[i] == '?') cnt[0]++;
else if(s[i] == '1') cnt[1]++;
}
ans = 0;
if(cnt[0] <= n / 3) f(0, 0, 0);
else if(cnt[1] <= n / 3) f(0, 1, 0);
else f(0, 2, 0);
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... |