Submission #1125163

#TimeUsernameProblemLanguageResultExecution timeMemory
1125163Paz15Snake Escaping (JOI18_snake_escaping)C++20
100 / 100
1071 ms17656 KiB
//fast
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;

#define all(x) x.begin(),x.end()
#define rep(n) for (int i = 0 ; i<n ; i++)
#define pb push_back

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
	int n,q;
	cin >> n >> q;
	string s;
	cin >> s;
	int m = (1<<n);
	int norm[m];
	rep(m) norm[i] = s[i]-'0';
	rep(n){
		for (int j = m-1 ; j>=0 ; j--){
			if (j&(1<<i)){
				norm[j]+=norm[j-(1<<i)];
			}
		}
	}
	int odw[m];
	rep(m) odw[i] = s[i]-'0';
	rep(n){
		for (int j = 0 ; j<m-1 ; j++){
			if (!(j&(1<<i))){
				odw[j]+=odw[j+(1<<i)];
			}
		}
	}
	while (q--){
		string wej;
		cin >> wej;
		int zero = 0;
		int jed = 0;
		int zap = 0;
		for (char i : wej){
			if (i=='0') zero++;
			if (i=='1') jed++;
			if (i=='?') zap++;
		}
		if (zero<jed && zero<zap){
			int base = 0;
			vector<int> v;
			rep(n){
				if (wej[n-i-1]=='1') base+=(1<<i);
				if (wej[n-i-1]=='0') v.pb((1<<i));
			}
			ll w = 0;
			rep(1<<v.size()){
				int sum = base;
				int ile = v.size();
				for (int j = 0 ; j<v.size() ; j++){
					if ((1<<j)&i){
						ile--;
						sum+=v[j];
					}
				}
				if ((ile%2)==(v.size()%2)) w+=odw[sum];
				else w-=odw[sum];
			}
			cout << w << '\n';
		}else if (jed<zap){
			int base = 0;
			vector<int> v;
			rep(n){
				if (wej[n-i-1]=='?') base+=(1<<i);
				if (wej[n-i-1]=='1') v.pb(1<<i);
			}
			ll w = 0;
			rep(1<<v.size()){
				int sum = base;
				int ile = 0;
				for (int j = 0 ; j<v.size() ; j++){
					if ((1<<j)&i){
						ile++;
						sum+=v[j];
					}
				}
				if ((ile%2)==(v.size()%2)) w+=norm[sum];
				else w-=norm[sum];
			}
			cout << w << '\n';
		}else{
			int base = 0;
			vector<int> v;
			rep(n){
				if (wej[n-i-1]=='1') base+=(1<<i);
				if (wej[n-i-1]=='?') v.pb((1<<i));
			}
			int w = 0;
			rep(1<<v.size()){
				int sum = base;
				for (int j = 0 ; j<v.size() ; j++){
					if ((1<<j)&i){
						sum+=v[j];
					}
				}
				w+=s[sum]-'0';
			}
			cout << w << '\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...