제출 #1278147

#제출 시각아이디문제언어결과실행 시간메모리
1278147PlayVoltzSnake Escaping (JOI18_snake_escaping)C++20
0 / 100
1 ms332 KiB
#include <cstdio>
#include <stdio.h>
#include <stdbool.h>
#include <iostream>
#include <map>
#include <vector>
#include <climits>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <cmath>
#include <cctype>
#include <bitset>
#include <iomanip>
#include <cstring>
#include <numeric>
#include <cassert>
#include <random>
using namespace std;
 
#define int long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second

int32_t main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n, q;
	string s;
	cin>>n>>q>>s;
	vector<int> vect(n), sup((1<<n), 0), sub((1<<n), 0);
	for (int i=0; i<(1<<n); ++i)vect[i]=sup[i]=sub[i]=s[i]-'0';
	for (int i=0; i<n; ++i)for (int mask=0; mask<(1<<n); ++mask){
		if (mask&(1<<i))sub[mask]+=sub[mask^(1<<i)];
		else sup[mask]+=sup[mask^(1<<i)];
	}
	while (q--){
		cin>>s;
		reverse(s.begin(), s.end());
		int a=0, b=0, c=0, aa=0, bb=0, cc=0, res=0;
		for (int i=0; i<n; ++i){
			if (s[i]=='0')++aa, a|=(1<<i);
			else if (s[i]=='1')++bb, b|=(1<<i);
			else ++cc, c|=(1<<i);
		}
		if (min({aa, bb, cc})==aa){
			for (int mask=a; mask; mask=(mask-1)&a)res+=(1-2*(__builtin_popcount(mask)%2))*sup[mask|b];
			res+=sup[b];
		}
		else if (min(bb, cc)==bb){
			for (int mask=b; mask; mask=(mask-1)&b)res+=(1-2*(__builtin_popcount(mask)%2))*sub[c|(mask^b)];
			res+=sub[c|b];
		}
		else{
			for (int mask=c; mask; mask=(mask-1)&c)res+=vect[b|mask];
			res+=vect[b];
		}
		cout<<res<<"\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...