제출 #1290655

#제출 시각아이디문제언어결과실행 시간메모리
1290655proplayerSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
407 ms25024 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const int maxN = (1 << 20) + 5;
const int Mod = 1e9 + 7;
int f[maxN], g[maxN];
int a[maxN], cntb[maxN];
int n, q;
void input()
{
    cin >> n >> q;
    for (int i = 0; i < (1 << n); ++i)
    {
        char c;
        cin >> c;
        a[i] = c - '0';
        cntb[i] = __builtin_popcountll(i);
        f[i] = a[i];
        g[i] = a[i];
    }

}
string s;
void solve()
{
    for (int i = 0; i < n; ++i)
        for (int mask = 0; mask < (1 << n); ++mask)
        {
            if (mask & (1 << i)) f[mask] += f[mask ^ (1 << i)];
            if (!(mask & (1 << i))) g[mask] += g[mask ^ (1 << i)];
        }
    for (int i = 1; i <= q; ++i)
    {
        cin >> s;
        int mask = 0, mask1 = 0, mask0 = 0;
        int cnt1 = 0, cnt0 = 0, cnt = 0;
        for (int j = 0; j < s.size(); ++j)
        {
            if (s[j] == '?')
            {
                mask |= (1 << (s.size() - j - 1));
                ++cnt;
            }
            if (s[j] == '0')
            {
                mask0 |= (1 << (s.size() - j - 1));
                ++cnt0;
            }
            if (s[j] == '1')
            {
                mask1 |= (1 << (s.size() - j - 1));
                ++cnt1;
            }
        }
        int res = 0;
        if (cnt == min({cnt, cnt0, cnt1}))
        {
            res = a[mask1];
            for (int s = mask; s > 0; s = (s - 1) & mask)
                res += a[mask1 ^ s];
        }
        else if (cnt1 == min({cnt, cnt0, cnt1}))
        {
            mask0 = ((1 << n) - 1) ^ mask0;
            res = f[mask0];
            //cerr << mask0 << " " << res << " " << f[9] << "a\n";
            for (int s = mask1; s > 0; s = (s - 1) & mask1)
            {
                if (cntb[s] % 2 == 1) res -= f[mask0 ^ s];
                else res += f[mask0 ^ s];
//                cerr << (mask0 ^ s) << "\n";
            }
        }
        else
        {
            res = g[mask1];
            for (int s = mask0; s > 0; s = (s - 1) & mask0)
            {
                if (cntb[s] % 2 == 1) res -= g[mask1 ^ s];
                else res += g[mask1 ^ s];
            }
        }
        cout << res << "\n";
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
//    freopen("P2.inp","r",stdin);
//    freopen("P2.out","w",stdout);
    input();
    solve();
}

#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...