#include <bits/stdc++.h>
using namespace std;;
#define ll long long
#define ar array
#define ld long double
#define int long long
#define all(v) v.begin(), v.end()
// #pragma GCC optimize("O3,Ofast,unroll-loops ")
const int N = 5e5 + 20;
const int M = 20;
const int LOG = 20;
const int INF = 1e17;
int MOD = 1e9 + 7;
const ld EPS = 1e-12;
template<typename T>
inline void chmin(T &x,T y){x = min(x, y);}
template<typename T>
inline void chmax(T &x,T y){x = max(x, y);}
inline void mm(int &x){x = (x % MOD + MOD) % MOD;};
struct DSU{
vector<int> p, sz;
int sum1, sum2;
vector<pair<int&,int>>U;
void init(int n){
p.resize(n);
sz.resize(n, 1);
iota(all(p), 0);
sum1 = n;
sum2 = n;
}
int fnd(int x){
if(p[x] == x)return x;
return fnd(p[x]);
}
bool upd(int a,int b){
a = fnd(a);
b = fnd(b);
if(a == b)return 0;
if(sz[a] > sz[b])swap(a, b);
U.push_back({sum1, sum1});
U.push_back({sum2, sum2});
U.push_back({p[a], p[a]});
U.push_back({sz[b], sz[b]});
sum1 -= sz[a];
sum1 -= sz[b];
sum2 -= sz[a] * sz[a];
sum2 -= sz[b] * sz[b];
p[a] = b;
sz[b] += sz[a];
sum1 += sz[b];
sum2 += sz[b] * sz[b];
return 1;
}
int getTime(){
return U.size();
}
void roll(int x){
while(U.size() > x){
U.back().first = U.back().second;
U.pop_back();
}
}
int qry(int x){
x = fnd(x);
return sz[x];
}
};
void orz(){
int n;
int q;
cin>>n;
cin>>q;
string s;
cin>>s;
int pref[(1 << n)];
int suff[(1 << n)];
for(int i = 0;i < (1 << n);i++){
pref[i] = suff[i] = s[i] - '0';
}
for(int j = 0;j < n;j++){
for(int x = 0;x < (1 << n);x++){
if((1 << j) & x){
pref[x] += pref[x ^ (1 << j)];
suff[x ^ (1 << j)] += suff[x];
}
}
}
// assert(0);
while(q--){
string t;
cin>>t;
int cnt[3] = {0};
for(auto u: t){
if(u == '0')cnt[0]++;
else if(u == '1')cnt[1]++;
else cnt[2]++;
}
if(cnt[2] <= 6){
vector<int> p;
int x = 0;
for(int i = 0;i < n;i++){
int b = n - i - 1;
if(t[i] == '1')x += (1 << b);
else if(t[i] == '?')p.push_back((1 << b));
}
int ans = 0;
for(int i = 0;i < (1 << p.size());i++){
int xx = x;
for(int j = 0;j < p.size();j++){
if((1 << j) & i)xx += p[j];
}
ans += s[xx] - '0';
}
cout<<ans<<'\n';
}else if(cnt[0] <= 6){
vector<int> p;
int x = 0;
for(int i = 0;i < n;i++){
int b = n - i - 1;
if(t[i] == '1')x += (1 << b);
else if(t[i] == '0')p.push_back((1 << b));
}
int ans = 0;
for(int i = 0;i < (1 << p.size());i++){
int xx = x;
for(int j = 0;j < p.size();j++){
if((1 << j) & i)xx += p[j];
}
ans += (__builtin_parity(i) ? suff[xx] : -suff[xx]);
}
cout<<abs(ans)<<'\n';
}else{
vector<int> p;
int x = 0;
for(int i = 0;i < n;i++){
int b = n - i - 1;
if(t[i] == '0')continue;
x += (1 << b);
if(t[i] == '1')p.push_back(-(1 << b));
}
int ans = 0;
for(int i = 0;i < (1 << p.size());i++){
int xx = x;
for(int j = 0;j < p.size();j++){
if((1 << j) & i)xx += p[j];
}
ans += (__builtin_parity(i) ? pref[xx] : -pref[xx]);
}
cout<<abs(ans)<<'\n';
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin>>t;
while (t--)orz();
}
# | 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... |