제출 #1290467

#제출 시각아이디문제언어결과실행 시간메모리
1290467windowwifeSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
775 ms20600 KiB
#include<bits/stdc++.h>
#define ll long long
#define task ""
using namespace std;
const int maxn = (1 << 20) + 5;
int l, q, a[maxn], dp[maxn], dp2[maxn], m0, m1, mq, cnt0, cnt1, cntq, res;
char c;
int main()
{
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> l >> q;
    for (int i = 0; i < (1 << l); i++)
    {
        cin >> c;
        a[i] = dp[i] = dp2[i] = c - '0';
    }
    for (int j = 0; j < l; j++)
        for (int i = 0; i < (1 << l); i++)
            if ((i >> j) & 1)
            {
                dp[i] += dp[i ^ (1 << j)];
                dp2[i ^ (1 << j)] += dp2[i];
            }
    while (q--)
    {
        m0 = m1 = mq = 0;
        cnt0 = cnt1 = cntq = 0;
        res = 0;
        for (int j = l - 1; j >= 0; j--)
        {
            cin >> c;
            if (c == '0')
            {
                m0 ^= (1 << j);
                cnt0++;
            }
            else if (c == '1')
            {
                m1 ^= (1 << j);
                cnt1++;
            }
            else
            {
                mq ^= (1 << j);
                cntq++;
            }
        }
        if (cntq <= min(cnt0, cnt1))
        {
            for (int i = mq; true; i = (i - 1) & mq)
            {
                res += a[i ^ m1];
                if (i == 0) break;
            }
        }
        else if (cnt1 <= min(cntq, cnt0))
        {
            for (int i = m1; true; i = (i - 1) & m1)
            {
                if ((cnt1 ^ __builtin_popcount(i)) & 1) res -= dp[i ^ mq];
                else res += dp[i ^ mq];
                if (i == 0) break;
            }
        }
        else
        {
            for (int i = m0; true; i = (i - 1) & m0)
            {
                if (__builtin_popcount(i) & 1) res -= dp2[i ^ m1];
                else res += dp2[i ^ m1];
                if (i == 0) break;
            }
        }
        cout << res << '\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...