제출 #853198

#제출 시각아이디문제언어결과실행 시간메모리
853198Ahmed57Snake Escaping (JOI18_snake_escaping)C++17
100 / 100
1734 ms40064 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("Ofast") #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt") int arr[(1<<20)]; int sup[(1<<20)] = {0},super[(1<<20)] = {0}; signed main(){ ios_base::sync_with_stdio(false);cin.tie(0); int n,m; cin>>n>>m; string s;cin>>s; for(int i = 0;i<(1<<n);i++){ sup[i] = super[i] = arr[i] = (s[i]-'0'); } for(int i = 0;i<n;i++){ for(int mask = 0;mask<(1<<n);mask++){ if(mask&(1<<i)){ super[mask^(1<<i)]+=super[mask]; sup[mask]+=sup[mask^(1<<i)]; } } } while(m--){ string s;cin>>s; int zero = 0 , one = 0 , qu = 0; for(int i = 0;i<n;i++){ if(s[i]=='0')zero+=(1<<(n-i-1)); else if(s[i]=='1')one+=(1<<(n-i-1)); else qu+=(1<<(n-i-1)); } long long all = 0; if(__builtin_popcount(one)<=6) { for(int mask = one;;mask=(one&(mask-1))){ if(__builtin_popcount(mask)&1)all-=sup[mask^one^qu]; else all+=sup[mask^one^qu]; if(mask==0)break; } }else if(__builtin_popcount(qu)<=6){ for(int mask = qu;;mask=(qu&(mask-1))){ all+=arr[mask|one]; //cout<<mask<<endl; if(mask==0)break; } }else if(__builtin_popcount(zero)<=6){ for(int mask = zero;;mask=(zero&(mask-1))){ if(__builtin_popcount(mask)&1)all-=super[mask|one]; else all+=super[mask|one]; if(mask==0)break; } } cout<<all<<endl; } }
#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...