제출 #716750

#제출 시각아이디문제언어결과실행 시간메모리
716750oooSnake Escaping (JOI18_snake_escaping)C++14
100 / 100
1471 ms39192 KiB
#include <bits/stdc++.h>
using namespace std;

const int nu = (1<<20);
int n, query, f[2][nu];
string s;
vector<int> cnt0, cnt1, cnt2;
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n >> query >> s;
    for(int i = 0; i < (1<<n); ++i) f[0][i] = f[1][i] = s[i]-48;

    for(int i = 0; i < n; ++i)
        for(int j = 0; j < (1<<n); ++j)
        if((1<<i)&j) f[0][j] += f[0][j^(1<<i)];
        else f[1][j] += f[1][j^(1<<i)];

    while(query > 0)
    {
        string x;
        cin >> x;
        int num0 = 0; int num1 = 0; int num2 = 0; int ans = 0;
        for(int i = 0; i < int(x.size()); ++i)
        if(x[i] == '0') cnt0.push_back(n-i-1), num0 += (1<<(n-i-1)); else if(x[i] == '1') cnt1.push_back(n-i-1), num1 += (1<<(n-i-1));
        else cnt2.push_back(n-i-1), num2 += (1<<(n-i-1));
        if(int(cnt1.size()) <= n/3)
        {
            int len = int(cnt1.size());
            for(int i = 0; i < (1<<len); ++i)
                {
                    int num = 0; int d = 0;
                    for(int j = 0; j < len; ++j)
                    if((1<<j)&i) num += (1<<cnt1[j]), d++;

                    if(d&1) ans -= f[0][num|num2]; else ans += f[0][num|num2];
                }
            ans = abs(ans);
        }
        else if(int(cnt0.size()) <= n/3)
        {
            int len = int(cnt0.size());
            for(int i = 0; i < (1<<len); ++i)
                {
                    int num = 0; int d = 0;
                    for(int j = 0; j < len; ++j)
                    if((1<<j)&i) num += (1<<cnt0[j]), d++;

                    if(d&1) ans -= f[1][num|num1]; else ans += f[1][num|num1];
                }
            ans = abs(ans);
        }
        else
        {
            int len = int(cnt2.size());
            for(int i = 0; i < (1<<len); ++i)
                {
                    int num = 0; int d = 0;
                    for(int j = 0; j < len; ++j)
                    if((1<<j)&i) num += (1<<cnt2[j]), d++;

                    ans += s[num|num1]-48;
                }

        }
        cout << ans << '\n';
        cnt0.clear(); cnt1.clear(); cnt2.clear();
        --query;
    }
    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...