제출 #1290564

#제출 시각아이디문제언어결과실행 시간메모리
1290564duyanhchupapiSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
920 ms17780 KiB
#include <bits/stdc++.h>
using namespace std; 
using ll = long long; 
const int N = (1 << 20) + 200, infint = 2e9;
const ll infll = 9e18;
int q, L, dp[N], DP[N], mask0, mask1, cnt0, cnt1, cnt2, ans, sz;
string s;

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
	
	cin >> L >> q >> s;
	int base = (1 << L) - 1;
	for(int i = 0;i < (1 << L); ++i) DP[i] = s[i] - '0', dp[base ^ i] = DP[i];
	
	for(int j = 0; j < L; ++j) {
		for(int mask = 0; mask < (1 << L); ++mask) 
	 		if(mask & (1 << j)) 
			 	dp[mask ^ (1 << j)] += dp[mask], DP[mask ^ (1 << j)] += DP[mask];
	}

	while (q--) {
		string t;
		cin >> t;
		vector <int> luu0, luu1, luu2;
		ans = mask0 = mask1 = cnt0 = cnt1 = cnt2 = 0;
		
		for(int i = 0;i < L; ++i) {
			if(t[i] == '1') mask1 += (1 << L - i - 1), cnt1++, luu1.push_back(L - i - 1);
			else if(t[i] == '0') mask0 += (1 << L - i - 1), cnt0++, luu0.push_back(L - i - 1);
			else cnt2++, luu2.push_back(L - i - 1);
		}
		
		int kid = min({cnt0, cnt1, cnt2}), sz;
		if (cnt0 == kid) {
			sz = luu0.size();
			for(int mask = 0; mask < (1 << sz); ++mask) {
				int nmask = mask1, dem = 0;
				for (int i=0; i < sz; ++i) if(mask & (1 << i)) nmask |= (1 << luu0[i]), dem++;
				if(dem % 2 == 0) ans += DP[nmask];
				else ans -= DP[nmask];
			}
		}
		else if (cnt1 == kid) {
			sz = luu1.size();
			for(int mask = 0; mask < (1 << sz); ++mask) {
				int nmask = mask0, dem = 0;
				for (int i=0; i < sz; ++i) if(mask & (1 << i)) nmask |= (1 << luu1[i]), dem++;
				if(dem % 2 == 0) ans += dp[nmask];
				else ans -= dp[nmask];
			}
		}
		else {
			sz = luu2.size();
			for(int mask = 0; mask < (1 << sz); ++mask) {
				int nmask = mask1;
				for (int i = 0; i < sz; ++i) if(mask & (1 << i)) nmask |= (1 << luu2[i]);
				ans += s[nmask] - '0';
			}
		}
		
		cout << ans << '\n';
	}
	
	return 0;
}
#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...