#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[(1<<20)];
int f[(1<<20)], g[(1<<20)];
signed main(){
int l, q;
cin >> l >> q;
string s;
cin >> s;
for (int i = 0;i<s.size();++i){
a[i] = s[i]-'0';
f[i] = a[i];
g[i] = a[i];
}
int maxn = (1<<l);
for (int i = 0;i<l;++i){
for (int j = 0;j<maxn;++j){
if(j&(1<<i)){
f[j] += f[j ^ (1<<i)];
}else{
g[j] += g[j | (1<<i)];
}
}
}
// cout << g[0];return 0;
while(q--){
string t;
cin >> t;
reverse(t.begin(), t.end());
int A = 0, B = 0, C = 0;
for (int i = 0;i<l;++i){
if(t[i]=='0'){
A |= (1<<i);
}else if(t[i]=='1'){
B |= (1<<i);
}else C |= (1<<i);
}
int res = 0;
if(__builtin_popcount(C)<=(l/3)){
// cout << "NGU ";
int s = C;
while(s>0){
res += a[B|s];
s = (s-1)&C;
}
res += a[B];
}else if(__builtin_popcount(A)<=(l/3)){
// cout << "LON ";
int s = A;
while(s>0){
// cout << s << ' ';
if(__builtin_popcount(s)%2==0){
res += g[B|s];
}else res-=g[B|s];
s = (s-1)&A;
}
res += g[B];
}else{
// cout << "CAC ";
int s = B;
while(s>0){
if(__builtin_popcount(s)%2==0){
res += f[C|s];
}else res-= f[C|s];
s = (s-1)&B;
}
res += f[C];
}
cout << res << '\n';
}
}
# | 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... |