Submission #1271444

#TimeUsernameProblemLanguageResultExecution timeMemory
1271444ZeroCoolSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
886 ms43284 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...