Submission #1298024

#TimeUsernameProblemLanguageResultExecution timeMemory
1298024ender_shayanSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1692 ms17816 KiB
#include <bits/stdc++.h> using namespace std; // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/tree_policy.hpp> // using namespace __gnu_pbds; typedef long long ll; typedef long double ld; typedef pair<int, int> pii ; typedef pair<ll, ll> pll ; typedef vector<pii> vii ; typedef vector<int> veci ; typedef vector<pll> vll ; typedef vector<ll> vecll; // find_by_order order_of_key //#pragma GCC optimize("O3,unroll-loops") //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> #define F first #define S second #define pb push_back #define endl '\n' #define Mp make_pair #define all(x) x.begin(), x.end() #define debug(x) cerr << #x << " = " << x << endl #define set_dec(x) cout << fixed << setprecision(x); #define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define file_io freopen("in.txt" , "r" , stdin) ; freopen("out.txt" , "w" , stdout); #define lb lower_bound #define ub upper_bound #define for1(n) for(int i=1;i<=n;i++) #define for0(n) for(int i=0;i<n;i++) #define forn(n) for(int i=n;i>0;i--) #define pq priority_queue <pii, vector<pii>, greater<pii>> const ll mod = 1e9+7 ;// 998244353 ;// 1e9+9; ll inf=1e18; const int N=20,L=21,bs=701,NN=1e6; int n,m,k,q; int dp[1<<N],dp2[1<<N]; string s; int main(){ fast_io cin>>n>>q; cin>>s; for0(1<<n){ s[i]-='0'; dp[i]=s[i]; dp2[i]=s[i]; } for(int j=0;j<n;j++){ for(int msk=0;msk<(1<<n);msk++){ if(msk>>j&1) dp[msk]+=dp[msk^(1<<j)]; } for(int msk=(1<<n)-1;msk>=0;msk--){ if((msk>>j&1)==0) dp2[msk]+=dp2[msk^(1<<j)]; } } while(q--){ string t;cin>>t;reverse(all(t)); vector<int>vec1,vec2,vec3; int msk1=0,msk2=0,msk3=0; for0(n){ if(t[i]=='0'){vec1.pb(1<<i);msk1|=1<<i;} else if(t[i]=='1'){vec2.pb(1<<i);msk2|=1<<i;} else {vec3.pb(1<<i);msk3|=1<<i;} } ll ans=0; if(vec3.size()<=min(vec1.size(),vec2.size())){ for(int msk=0;msk<(1<<vec3.size());msk++){ int msk4=0; for(int j=0;j<vec3.size();j++)if(msk>>j&1) msk4|=vec3[j]; ans+=s[msk2|msk4]; } } else if(vec1.size()<=min(vec2.size(),vec3.size())){ for(int msk=0;msk<(1<<vec1.size());msk++){ int msk4=0,o=0; for(int j=0;j<vec1.size();j++)if(msk>>j&1){ msk4|=vec1[j]; o^=1; } ans+=dp2[msk2|msk4]*(o==0 ? 1:-1); } } else{ for(int msk=0;msk<(1<<vec2.size());msk++){ int msk4=0,o=0; for(int j=0;j<vec2.size();j++)if(msk>>j&1){ msk4|=vec2[j]; o^=1; } ans+=dp[(msk2|msk3)^msk4]*(o==0 ? 1:-1); } } cout<<ans<<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...