제출 #1228895

#제출 시각아이디문제언어결과실행 시간메모리
1228895DedibeatSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1178 ms26908 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define F first 
#define S second 
#define all(x) (x).begin(), (x).end()
template<typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p)
{
    return os << "(" << p.F << "," << p.S << ")";
}
template<typename T> 
void print(const T &v, int lim = 1e9)
{
    for(auto x : v)
        if(lim-- > 0) cout << x << " ";
    cout << "\n";
}


int main()
{
    ios::sync_with_stdio(0); cin.tie(NULL);
    int n, q;
    cin >> n >> q;
    string s, t;
    cin >> s;
    int F0[(1 << n)];
    int F1[(1 << n)];
    for(int mask = 0; mask < (1 << n); mask++)
    {
        F0[mask] = s[mask] - '0';
        F1[mask] = s[(1 << n) - mask - 1] - '0';
        
    }
    for(int i = 0; i < n; i++)
    {
        for(int mask = 0; mask < (1 << n); mask++)
        {
            if(mask & (1 << i)) 
            {
                F0[mask] += F0[mask ^ (1 << i)];
                F1[mask] += F1[mask ^ (1 << i)];
            }
        }
    }

    while(q--)
    {
        cin >> t;
        vector<int> e0, e1, e2;
        int num = 0, num2 = 0;
        for(int i = 0; i < t.size(); i++)
        {
            int exp = (1 << (t.size() - i - 1));

            if(t[i] == '0') e0.push_back(exp);
            else if(t[i] == '1') e1.push_back(exp), num2 += exp;
            else 
            {
                e2.push_back(exp);
                num += exp;
            }
        }

        // cout << "num: " << num << endl;

        if(e0.size() <= 6)
        {
            int m = e0.size(), ans = 0;
            // print(e0);
            for(int mask = 0; mask < (1 << m); mask++)
            {
                int tmp = 0;
                int p_cnt = 0;
                for(int i = 0; i < m; i++)
                {
                    if(mask & (1 << i)) 
                    {
                        tmp |= e0[i];
                        p_cnt++;
                    }
                }

                if(p_cnt & 1)
                    ans += F1[tmp | num];
                else 
                    ans -= F1[tmp | num];
            }

            cout << abs(ans) << '\n';
        }
        else if(e1.size() <= 6)
        {
            int m = e1.size(), ans = 0;
            // print(e0);
            for(int mask = 0; mask < (1 << m); mask++)
            {
                int tmp = 0;
                int p_cnt = 0;
                for(int i = 0; i < m; i++)
                {
                    if(mask & (1 << i)) 
                    {
                        tmp |= e1[i];
                        p_cnt++;
                    }
                }

                if(p_cnt & 1)
                    ans += F0[tmp | num];
                else 
                    ans -= F0[tmp | num];
            }

            cout << abs(ans) << '\n';

        }
        else 
        {
            int m = e2.size(), ans = 0;
            // print(e0);
            for(int mask = 0; mask < (1 << m); mask++)
            {
                int tmp = 0;
                for(int i = 0; i < m; i++)
                {
                    if(mask & (1 << i)) 
                        tmp |= e2[i];
                }
                ans += s[tmp | num2] - '0';
            }
            cout << ans << "\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...