제출 #1336543

#제출 시각아이디문제언어결과실행 시간메모리
1336543sh_qaxxorov_571Snake Escaping (JOI18_snake_escaping)C++20
22 / 100
218 ms14160 KiB
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int L, Q;
int toxicity[1 << 20];
int sub_sum[1 << 20];
int super_sum[1 << 20];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> L >> Q;
    string S;
    cin >> S;

    for (int i = 0; i < (1 << L); i++) {
        toxicity[i] = S[i] - '0';
        sub_sum[i] = toxicity[i];
        super_sum[i] = toxicity[i];
    }

    // SOS DP (Sum Over Subsets) - qism to'plamlar yig'indisi uchun
    for (int i = 0; i < L; i++) {
        for (int mask = 0; mask < (1 << L); mask++) {
            if (mask & (1 << i)) {
                sub_sum[mask] += sub_sum[mask ^ (1 << i)];
            }
        }
    }

    // Sum Over Supersets - ust-to'plamlar yig'indisi uchun
    for (int i = 0; i < L; i++) {
        for (int mask = (1 << L) - 1; mask >= 0; mask--) {
            if (!(mask & (1 << i))) {
                super_sum[mask] += super_sum[mask ^ (1 << i)];
            }
        }
    }

    while (Q--) {
        string T;
        cin >> T;
        
        int mask0 = 0, mask1 = 0, maskQ = 0;
        int q_count = 0, zero_count = 0, one_count = 0;

        for (int i = 0; i < L; i++) {
            int bit = L - 1 - i;
            if (T[i] == '0') {
                zero_count++;
            } else if (T[i] == '1') {
                mask1 |= (1 << bit);
                one_count++;
            } else {
                maskQ |= (1 << bit);
                q_count++;
            }
        }

        long long ans = 0;
        if (q_count <= 6) {
            // '?' belgilari kam bo'lsa, barcha variantlarni tekshiramiz
            for (int m = maskQ; ; m = (m - 1) & maskQ) {
                ans += toxicity[mask1 | m];
                if (m == 0) break;
            }
        } else if (one_count <= 6) {
            // '1' belgilari kam bo'lsa, Inclusion-Exclusion (Kiritish-chiqarish) prinsipi
            for (int m = mask1; ; m = (m - 1) & mask1) {
                if (__builtin_popcount(mask1 ^ m) % 2 == 1) {
                    ans -= sub_sum[maskQ | m];
                } else {
                    ans += sub_sum[maskQ | m];
                }
                if (m == 0) break;
            }
        } else {
            // '0' belgilari kam bo'lsa, Inclusion-Exclusion
            int mask0_full = ((1 << L) - 1) ^ mask1 ^ maskQ;
            for (int m = mask0_full; ; m = (m - 1) & mask0_full) {
                if (__builtin_popcount(mask0_full ^ m) % 2 == 1) {
                    ans -= super_sum[mask1 | m];
                } else {
                    ans += super_sum[mask1 | m];
                }
                if (m == 0) break;
            }
        }
        cout << ans << "\n";
    }

    return 0;
}
#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...