Submission #996431

#TimeUsernameProblemLanguageResultExecution timeMemory
996431yanbSnake Escaping (JOI18_snake_escaping)C++14
12 / 100
2009 ms23816 KiB
#include <bits/stdc++.h>
    
using namespace std;
    
#define int long long
#define pii pair<long long, long long>
#define t3i tuple<long long, long long, long long>

const int MinVop = 10;

int calc(vector<int> &tri, int x, int l, string &tox) {
    if (l == x) {
        int v = 0;
        for (int i = 0; i < l; i++) {
            v *= 2;
            v += tri[i];
        }
        return tox[v] - '0';
    }
    if (tri[x] == 2) {
        int ans = 0;
        tri[x] = 0;
        ans += calc(tri, x + 1, l, tox);
        tri[x] = 1;
        ans += calc(tri, x + 1, l, tox);
        tri[x] = 2;
        return ans;
    }
    return calc(tri, x + 1, l, tox);
}

int build(vector<int> &tri, vector<int> &ans, string &tox, int l, int q) {
    int v = 0, vop = 0;
    for (int i = 0; i < l; i++) {
        v *= 3;
        v += tri[i];
        vop += (tri[i] == 2);
    }

    if (vop < MinVop) {
        vector<int> tri_(l);
        for (int i = 0; i < l; i++) tri_[i] = tri[i];
        ans[v] = calc(tri_, 0, l, tox);
    }

    if (ans[v] != -1) return ans[v];

    for (int i = 0; i < l; i++) {
        if (tri[i] == 2) {
            int cans = 0;
            tri[i] = 0;
            cans += build(tri, ans, tox, l, q);
            tri[i] = 1;
            cans += build(tri, ans, tox, l, q);
            tri[i] = 2;
            ans[v] = cans;
        }
    }

    return ans[v];
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int l, q;
    string tox;
    cin >> l >> q >> tox;
    
    vector<int> ans(pow(3, l) + 100, -1);
    vector<int> tri(l, 2);
    build(tri, ans, tox, l, q);

    while (q--) {
        string s;
        cin >> s;
        int v = 0, vop = 0;
        for (int i = 0; i < l; i++) {
            v *= 3;
            v += (s[i] == '?' ? 2 : s[i] - '0');
            vop += (s[i] == '?');
        }

        if (vop >= MinVop) {
            cout << ans[v] << "\n";
        } else {
            vector<int> tri(l);
            for (int i = 0; i < l; i++) tri[i] = (s[i] == '?' ? 2 : s[i] - '0');
            cout << calc(tri, 0, l, tox) << "\n";
        }
    }
}   
#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...