Submission #1298038

#TimeUsernameProblemLanguageResultExecution timeMemory
1298038mohammadsamSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
374 ms17760 KiB
/*
    in the name of god
*/
//#pragma GCC optimize("Ofast,O3,unroll-loops")
//#pragma GCC target("avx,avx2,fma")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,avx,avx2,popcnt,tune=native")

#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;
typedef pair<long long ,long long> pll;
typedef long long ll ;

#define File          freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#define all(V)        V.begin(),V.end()
#define setprec(x)    fixed << setprecision(x)
#define Mp(a,b)       make_pair(a,b)
#define len(V)        (int)(V.size())
#define sep           ' '
#define endl          '\n'
#define pb            push_back
#define fi            first
#define sec           second
#define popcount(x)   __builtin_popcount(x)
#define lid           u<<1
#define rid           (lid)|1
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll N = 20,SQ=320,LOG=31;
const ll inf = 2e9 , MD = 1e9 + 7;

inline ll md(ll x){ x %= MD; return (x < 0 ? x + MD : x);}
int n , q;
string s;
string s2;
int sub[1<<N],over[1<<N];
int32_t main() {
    ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0);
    cin >> n >> q >> s;
    for(int mask = 0;mask < (1<<n);mask++){
        sub[mask] = over[mask] = (s[mask] - '0');
    }
    for(int i = 0;i<n;i++){
        for(int mask = 0;mask < (1<<n);mask++){
            if(mask&(1<<i)) sub[mask] += sub[mask^(1<<i)];
        }
    }
    for(int i = 0 ; i < n;i++){
        for(int mask = 0;mask < (1<<n);mask++){
            if((mask&(1<<i)) == 0) over[mask] += over[mask^(1<<i)];
        }
    }
    while(q--){
        cin >> s2;
        int mark=0,yek=0,sefr = 0;
        for(int i = 0 ;i < n;i++){
            if(s2[i] == '?') mark ^= (1<<(n - 1 - i));
            else if(s2[i] == '0') sefr ^= (1<<(n - 1- i));
            else yek ^= (1<<( n - 1 - i));
        }
        if(popcount(mark) <= 6){
            int ans = 0;
            for(int m = mark;;m = ((m-1)&mark)){
                ans += (s[m + yek] - '0');
                if(m == 0) break;
            }
            cout << ans << endl;
            continue;
        }
        if(popcount(yek) <= 6){
            int ans = 0;
            for(int m = yek;; m = ((m-1)&yek)){
                if((popcount(m)&1) == (popcount(yek)&1)) ans += sub[m + mark];
                else ans -= sub[m + mark];
                if(m == 0) break;
            }
            cout << ans << endl;
            continue;
        }
        int ans = 0;
        for(int m = sefr;;m = ((m-1)&sefr)){
            if(popcount(m)&1) ans -= over[m + yek];
            else ans += over[m + yek];
            if(m == 0) break;
        }
        cout << ans << endl;
    }
    return 0;
}
#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...