제출 #1276549

#제출 시각아이디문제언어결과실행 시간메모리
1276549sasdeSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1052 ms17792 KiB
#include<bits/stdc++.h>
using namespace std;
#define sz(a) (int)a.size()
#define all(x) x.begin(),x.end()
#define emb emplace_back
const int N=2e6+5;
int node,query,ans;
string s,x;
int dpcha[N],dpcon[N],po[N];
vector<int>res;
main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
        #define task "a"
    if(fopen(task".inp","r")){
      freopen(task".inp","r",stdin);
      freopen(task".out","w",stdout);
    }
    cin >> node >> query >> s;
    for(int i=0;i<(1<<node);++i){
        dpcon[i]=s[i]-'0';
        dpcha[i]=s[i]-'0';
    }
    for(int j=0;j<node;++j){
    for(int mask=0;mask<(1<<node);++mask){
            if(mask>>j&1)dpcha[mask]+=dpcha[mask^(1<<j)];
            else dpcon[mask]+=dpcon[mask^(1<<j)];
        }
    }
    // cout <<dp[]
    while(query--){
        cin >> x;
        vector<int>vec[3];
        ans=0;
        reverse(all(x));
        for(int i=0;i<sz(x);++i){
            char y=x[i];
            if(y=='?')vec[0].emb(i);
            if(y=='0')vec[1].emb(i);
            if(y=='1')vec[2].emb(i);
        }
        if(sz(vec[1])<=sz(x)/3){
            int mask=0;
            for(int i=0;i<node;++i)
                if(x[i]=='1')mask|=(1<<i);
            for(int i=0;i<(1<<sz(vec[1]));++i){
                int cnt=__builtin_popcount(i);
                int moc=mask;
                for(int j=0;j<sz(vec[1]);++j){
                    if((i>>j)&1)moc^=(1<<vec[1][j]);
                }
                if(cnt&1)ans-=dpcon[moc];
                else ans+=dpcon[moc];
            }
        }
        else
        if(sz(vec[2])<=sz(x)/3){
            int mask=0;
            for(int i=0;i<node;++i)
                if(x[i]=='1'||x[i]=='?')mask|=(1<<i);
            for(int i=0;i<(1<<sz(vec[2]));++i){
                int cnt=__builtin_popcount(i);
                int moc=mask;
                for(int j=0;j<sz(vec[2]);++j){
                    if((i>>j)&1)moc^=(1<<vec[2][j]);
                }
                if(cnt&1)ans-=dpcha[moc];
                else ans+=dpcha[moc];
            }
        }
        else
        {
            int mask=0;
            for(int i=0;i<node;++i)
                if(x[i]=='1')mask|=(1<<i);
            for(int i=0;i<(1<<sz(vec[0]));++i){
                int cnt=__builtin_popcount(i);
                int moc=mask;
                for(int j=0;j<sz(vec[0]);++j){
                    if((i>>j)&1)moc^=(1<<vec[0][j]);
                }
                ans+=s[moc]-'0';
            }
        }
        cout <<ans<<'\n';
    }
}

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

snake_escaping.cpp:11:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   11 | main()
      | ^~~~
snake_escaping.cpp: In function 'int main()':
snake_escaping.cpp:18:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |       freopen(task".inp","r",stdin);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
snake_escaping.cpp:19:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |       freopen(task".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...