Submission #1105684

#TimeUsernameProblemLanguageResultExecution timeMemory
1105684FucKanhSnake Escaping (JOI18_snake_escaping)C++11
100 / 100
1081 ms54444 KiB
#include<bits/stdc++.h>
#define ll long long
#define int ll
#define pii pair<int,int>

using namespace std;

const int BIT = 20;

int f[1<<BIT], g[1<<BIT], h[1<<BIT], ans;

void solve2(int i, vector<int> &v, int val) {
    if (i==v.size()) {
        ans += h[val];
        return;
    }
    val &= ~(1<<v[i]);
    solve2(i+1,v,val);
    val |= (1<<v[i]);
    solve2(i+1,v,val);
}

void solve1(int i, vector<int> &v, int val, int cnt) {
    if (i==v.size()) {
        if (cnt==0) return;
        if (cnt%2) {
            ans -= f[val];
        }
        else {
            ans += f[val];
        }
        return;
    }
    val |= (1<<v[i]);
    solve1(i+1,v,val,cnt);
    val &= ~(1<<v[i]);
    solve1(i+1,v,val,cnt+1);
}

void solve0(int i, vector<int> &v, int val, int cnt) {
    if (i==v.size()) {
        if (cnt==0) return;
        if (cnt%2) {
            ans -= g[val];
        }
        else {
            ans += g[val];
        }
        return;
    }
    val |= (1<<v[i]);
    solve0(i+1,v,val,cnt+1);
    val &= ~(1<<v[i]);
    solve0(i+1,v,val,cnt);
}

void solve() {
    int n,q; cin >> n >> q;
    for (int i =0; i < (1<<n); i++) {
        char c; cin >> c;
        f[i] += c - '0';
        g[i] += c - '0';
        h[i] += c - '0';
//        cerr << "cin >> " << bitset<5>(i) << " :" << c << endl;
    }
    for (int i = 0; i < n; i++) {
        for (int x = 0; x < (1<<n); x++) {
            if (x&(1<<i)) f[x] += f[x^(1<<i)];
            else g[x] += g[x^(1<<i)];
        }
    }

    for (int i = 0; i < q; i++) {
        string s; cin >> s;
        reverse(s.begin(), s.end());
        int cnt = 0, val = 0, val2 = 0,val1 = 0;
        vector<int> v1,v2,v0;
        for (char c : s) {
            if (c!='0') {
                val |= (1<<cnt);
                if (c=='1') {
                    val2 |= (1<<cnt);
                    v1.push_back(cnt);
                }
                else {
                    v2.push_back(cnt);
                    val1 |= (1<<cnt);
                }
            }
            else {
                v0.push_back(cnt);
            }
            cnt++;
        }
        if (v2.size() <= v1.size() && v2.size() <= v0.size()) {
            ans = 0;
            solve2(0,v2,val);
        }
        else if (v1.size() <= v2.size() && v1.size() <= v0.size()) {
            ans = f[val];
            solve1(0,v1,val,0);
        }
        else {
            ans = g[val2];
            solve0(0,v0,val2,0);
        }
        cout << ans << '\n';
    }
}

signed main() {
    cin.tie(0) -> sync_with_stdio(0);
    solve();
    return 0;
}

Compilation message (stderr)

snake_escaping.cpp: In function 'void solve2(long long int, std::vector<long long int>&, long long int)':
snake_escaping.cpp:13:10: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 |     if (i==v.size()) {
      |         ~^~~~~~~~~~
snake_escaping.cpp: In function 'void solve1(long long int, std::vector<long long int>&, long long int, long long int)':
snake_escaping.cpp:24:10: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |     if (i==v.size()) {
      |         ~^~~~~~~~~~
snake_escaping.cpp: In function 'void solve0(long long int, std::vector<long long int>&, long long int, long long int)':
snake_escaping.cpp:41:10: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |     if (i==v.size()) {
      |         ~^~~~~~~~~~
#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...