Submission #1237687

#TimeUsernameProblemLanguageResultExecution timeMemory
1237687dwuySnake Escaping (JOI18_snake_escaping)C++17
100 / 100
498 ms29500 KiB
/**         - lwuy -

      />    フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ

**/
#include <bits/stdc++.h>

#define fastIO ios_base::sync_with_stdio(false); cin.tie(NULL)
#define file(a) freopen(a".inp","r",stdin); freopen(a".out", "w",stdout)
#define fi first
#define se second
#define endl "\n"
#define len(s) (int)((s).size())
#define MASK(k)(1LL<<(k))
#define TASK "test"

using namespace std;

typedef tuple<int, int, int> tpiii;
typedef pair<double, double> pdd;
typedef pair<int, int> pii;
typedef long long ll;

const long long OO = 1e18;
const int MOD = 1e9 + 7;
const int INF = 1e9;
const int MX = MASK(20);

int n, q;
string s;
int a[MX];
int f[MX], rf[MX];
int cnt[MX];
// subset, superset;

int32_t main(){
    fastIO;
    //file(TASK);

    cin >> n >> q;
    cin >> s;
    for(int i=0; i<MASK(n); i++) a[i] = s[i] - '0';
    for(int i=0; i<MASK(n); i++) f[i] = rf[i] = a[i];
    for(int mask=1; mask<MASK(n); mask++) cnt[mask] = cnt[mask - (-mask & mask)] + 1;
    for(int i=0; i<n; i++){
        for(int mask=0; mask<MASK(n); mask++){
            mask |= MASK(i);
            f[mask] += f[mask ^ MASK(i)]; // subset
            rf[mask ^ MASK(i)] += rf[mask]; // superset
        }
    }

    while(q--){
        string s;
        cin >> s;
        int b[3] = {0};
        int c[3] = {0};
        for(char &e: s){
            for(int i=0; i<3; i++) c[i] <<= 1;
            if(e == '0') b[0]++, c[0]++;
            if(e == '1') b[1]++, c[1]++;
            if(e == '?') b[2]++, c[2]++;
        }
        int x = 0, ans = 0;
        int mn = min({b[0], b[1], b[2]});
        for(char c: s) x = (x << 1) | (c == '1');
        if(mn == b[0]){
            for(int mask=c[0]; ;mask=(mask - 1)&c[0]){
                int y = x ^ mask;
                ans += cnt[mask]&1 ? -rf[y] : rf[y];
                if(mask == 0) break;
            }
        }
        else if(mn == b[1]){
            for(int i=0; i<n; i++) if(s[i] == '?') x |= MASK(n - i - 1);
            for(int mask=c[1]; ;mask=(mask - 1)&c[1]){
                int y = x ^ mask;
                ans += cnt[mask]&1 ? -f[y] : f[y];
                if(mask == 0) break;
            }
        }
        else{
            for(int mask=c[2]; ;mask=(mask - 1)&c[2]){
                int y = x ^ mask;
                ans += a[y];
                if(mask == 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...