Submission #1304040

#TimeUsernameProblemLanguageResultExecution timeMemory
1304040anhkietSnake Escaping (JOI18_snake_escaping)C++20
22 / 100
240 ms26348 KiB
#include <bits/stdc++.h>

#define f first
#define s second
// #define int long long
#define sz(x) (int)(x).size()
#define MASK(x) (1ll << (x))
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()

using namespace std;

typedef long long ll;
typedef pair <int, int> ii;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll INF = 1e9 + 5;
const int mod = 1e9 + 7, base = 256, S = 320;

template <class X, class Y>
bool maximize(X &x, const Y &y) {
    if (x < y) {
        x = y; return true;
    }
    return false;
}

template <class X, class Y>
bool minimize(X &x, const Y &y) {
    if (x > y) {
        x = y; return true;
    }
    return false;
}

template <class X, class Y>
void add(X &x, const Y &y) {
    if ((x += y) >= mod) x -= mod;
}

template <class X, class Y>
void sub(X &x, const Y &y) {
    if ((x -= y) < 0) x += mod;
}

template <class T>
void compress(vector <T> &v) {
    sort(all(v)); v.resize(unique(all(v)) - v.begin());
}

const int N = MASK(20) + 5;

int n, q;
string s;
ll f[N], g[N], a[N];

void solve() {
    cin >> n >> q >> s;
    for (int i = 0; i < sz(s); i++) {
        a[i] = s[i] - '0';
    }

    int m = MASK(n);
    for (int i = 0; i < m; i++) {
        f[i] = g[i] = a[i];
    }

    for (int i = 0; i < n; i++) {
        for (int mask = 0; mask < m; mask++) {
            if (mask >> i & 1) f[mask] += f[mask ^ MASK(i)];
        }
    }

    for (int i = 0; i < n; i++) {
        for (int mask = 0; mask < m; mask++) {
            if (!(mask >> i & 1)) g[mask] += g[mask ^ MASK(i)];
        }
    }

    while (q--) {
        string str;
        cin >> str;

        reverse(all(str));
        int d1 = 0, d2 = 0, d3 = 0;
        int mask1 = 0, mask2 = 0, mask3 = 0;

        for (int i = 0; i < n; i++) {
            if (str[i] == '0') {
                d1++;
                mask1 |= MASK(i);
            }
            if (str[i] == '1') {
                d2++;
                mask2 |= MASK(i);
            }
            if (str[i] == '?') {
                d3++;
                mask3 |= MASK(i);
            }
        }

        ll res = 0;
        if (d1 <= 6) {
            res = g[mask2];
            for (int sub = mask1; sub > 0; sub = (sub - 1) & mask1) {
                if (__builtin_popcount(sub) & 1) res -= g[sub | mask2];
                else res += g[sub | mask2];
            }
        } else if (d2 <= 6) {
            res = (d2 & 1) ? -f[mask3] : f[mask3];
            for (int sub = mask2; sub > 0; sub = (sub - 1) & mask2) {
                if (__builtin_popcount(sub ^ mask2) & 1) res -= f[sub | mask3];
                else res += f[sub | mask3];
            }
        } else {
            res = a[mask1];
            for (int sub = mask3; sub > 0; sub = (sub - 1) & mask3) {
                res += a[sub | mask1];
            }
        }
        cout << res << "\n";
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    #define file ""
    if (fopen(file ".inp", "r")) {
        freopen(file ".inp", "r", stdin);
        freopen(file ".out", "w", stdout);
    }

    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

Compilation message (stderr)

snake_escaping.cpp: In function 'int main()':
snake_escaping.cpp:133:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  133 |         freopen(file ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
snake_escaping.cpp:134:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  134 |         freopen(file ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...