제출 #1278961

#제출 시각아이디문제언어결과실행 시간메모리
1278961PieArmySnake Escaping (JOI18_snake_escaping)C++20
100 / 100
480 ms25172 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)

int n,m,q;
int arr[1<<20];
int bir[1<<20],sif[1<<20];
int say[1<<20];

int main(){
	ios_base::sync_with_stdio(23^23);cin.tie(NULL);
	cin>>m>>q;
	n=(1<<m);
	for(int i=0;i<n;i++){
		char c;cin>>c;
		arr[i]=c-'0';
		bir[i]+=arr[i];
		sif[i]+=arr[i];
		say[i]=__builtin_popcount(i);
	}
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			if((j>>i)&1){
				sif[j-(1<<i)]+=sif[j];
			}
			else bir[j+(1<<i)]+=bir[j];
		}
	}
	while(q--){
		string s;cin>>s;
		reverse(s.begin(),s.end());
		int cnta=0,cntb=0,cntc=0;
		for(int i=0;i<m;i++){
			if(s[i]=='0')cnta++;
			else if(s[i]=='1')cntb++;
			else cntc++;
		}
		if(cntc<=6){
			int mask=0,x=0;
			for(int i=0;i<m;i++){
				if(s[i]=='?')mask+=(1<<i);
				else if(s[i]=='1')x+=(1<<i);
			}
			int ans=arr[x];
			for(int i=mask;i>0;i=((i-1)&mask)){
				ans+=arr[x^i];
			}
			cout<<ans<<endl;
		}
		else if(cntb<=6){
			int mask=0,x=0;
			for(int i=0;i<m;i++){
				if(s[i]=='1'){
					mask+=(1<<i);
					x+=(1<<i);
				}
				else if(s[i]=='?')x+=(1<<i);
			}
			int ans=bir[x];
			for(int i=mask;i>0;i=((i-1)&mask)){
				int k=1;
				if((say[i])&1)k=-1;
				ans+=bir[x^i]*k;
			}
			cout<<ans<<endl;
		}
		else{
			int mask=0,x=0;
			for(int i=0;i<m;i++){
				if(s[i]=='0')mask+=(1<<i);
				else if(s[i]=='1')x+=(1<<i);
			}
			int ans=sif[x];
			for(int i=mask;i>0;i=((i-1)&mask)){
				int k=1;
				if((say[i])&1)k=-1;
				ans+=sif[x^i]*k;
			}
			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...