제출 #1290519

#제출 시각아이디문제언어결과실행 시간메모리
1290519yoshi_33550336Snake Escaping (JOI18_snake_escaping)C++20
75 / 100
2097 ms57428 KiB
#include <bits/stdc++.h>
using namespace std;
#ifndef yoshi_likes_e4
#define endl '\n'
#endif
#define problem ""
#define multitest 0
#define debug(x) cerr << #x << " = " << x << endl;
void init()
{
}
int L, K;
short PreCalc[4096][6561];
vector<pair<int, int>> PreComp;
void recursion(int i, int mask1, int mask2, int value, int pw)
{
    if (i == L - K)
    {
        for (int k = 0; k < (1 << (L - K)); k++)
            if ((mask1 & k) == k && (mask2 & k) == mask2)
                PreComp.push_back({value, k});
    }
    else
    {
        recursion(i + 1, mask1, mask2, value, pw * 3);
        recursion(i + 1, mask1 | (1 << i), mask2 | (1 << i), value + pw, pw * 3);
        recursion(i + 1, mask1 | (1 << i), mask2, value + 2 * pw, pw * 3);
    }
}
void Yoshi()
{
    int Q;
    string s;
    cin >> L >> Q >> s;
    K = (L <= 13 ? 6 : 12);
    if (L <= K)
    {
        while (Q--)
        {
            string t;
            cin >> t;
            reverse(t.begin(), t.end());
            int mask1 = 0, mask2 = 0;
            for (int i = 0; i < t.size(); i++)
            {
                if (t[i] == '?')
                    mask1 |= (1 << i);
                else if (t[i] == '1')
                    mask1 |= (1 << i), mask2 |= (1 << i);
            }
            int r = 0;
            for (int i = 0; i < (1 << L); i++)
                if ((mask1 & i) == i && (mask2 & i) == mask2)
                    r += s[i] - '0';
            cout << r << endl;
        }
    }
    else
    {
        recursion(0, 0, 0, 0, 1);
        for (int low = 0; low < (1 << K); low++)
        {
            int a[1 << (L - K)];
            for (int i = 0; (i << K) < s.size(); i++)
                a[i] = max(0, s[(i << K) + low] - '0');
            for (auto &[x, y] : PreComp)
                PreCalc[low][x] += a[y];
        }
        while (Q--)
        {
            string t;
            cin >> t;
            reverse(t.begin(), t.end());
            int mask1 = 0, mask2 = 0;
            for (int i = 0; i < K; i++)
            {
                if (t[i] == '?')
                    mask1 |= (1 << i);
                else if (t[i] == '1')
                    mask1 |= (1 << i), mask2 |= (1 << i);
            }
            int pw = 1, g = 0;
            for (int i = K; i < t.size(); i++)
            {
                if (t[i] == '1')
                    g += pw;
                else if (t[i] == '?')
                    g += 2 * pw;
                pw *= 3;
            }
            int r = 0;
            for (int i = 0; i < (1 << K); i++)
                if ((mask1 & i) == i && (mask2 & i) == mask2)
                    r += PreCalc[i][g];
            cout << r << endl;
        }
    }
}
signed main()
{
#ifndef yoshi_likes_e4
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if (fopen(problem ".inp", "r"))
    {
        freopen(problem ".inp", "r", stdin);
        freopen(problem ".out", "w", stdout);
    }
#endif
    init();
    int t = 1;
#if multitest
    cin >> t;
#endif
    while (t--)
        Yoshi();
}

컴파일 시 표준 에러 (stderr) 메시지

snake_escaping.cpp: In function 'int main()':
snake_escaping.cpp:106:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  106 |         freopen(problem ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
snake_escaping.cpp:107:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |         freopen(problem ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...