제출 #1348782

#제출 시각아이디문제언어결과실행 시간메모리
1348782jahongirSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
594 ms17608 KiB
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

const int mxn = 1e6;
int super[1<<20], sub[1<<20];
int ind[3][20];

void solve(){
	int L,Q; cin >> L >> Q;
	string S; cin >> S;

	for(int i = 0; i < 1<<L; i++)
		super[i] = sub[i] = S[i]-'0';

	for(int i = 0; i < L; i++)
		for(int j = 0; j < 1<<L; j++)
			if(j&(1<<i)) sub[j] += sub[j^(1<<i)];
			else super[j] += super[j^(1<<i)];
	
	for(int _ = 0; _ < Q; _++){
		string T; cin >> T;
		reverse(T.begin(),T.end());

		int a = 0, b = 0, c = 0;

		for(int i = 0; i < L; i++){
			if(T[i]=='0'){
				ind[0][a++] = i;
			}else if(T[i]=='1'){
				ind[1][b++] = i;
			}else{
				ind[2][c++] = i;
			}
		}

		int mn = min({a,b,c});

		if(mn == a){
			
			int sum = 0;
			int num = 0;

			for(int i = 0; i < L; i++) if(T[i]=='1')
				num ^= (1<<i);

			for(int mask = 0; mask < 1<<a; mask++){
				int dnum = num;
				for(int i = 0; i < a; i++) if(mask&(1<<i))
					dnum ^= (1<<ind[0][i]);

				if(__builtin_popcount(mask)&1) sum -= super[dnum];
				else sum += super[dnum];
			}
				
			cout << sum << '\n';
			
		}else if(mn == b){
			
			int sum = 0;
			int num = 0;
			
			for(int i = 0; i < L; i++) if(T[i]!='0')
				num ^= (1<<i);
			
			for(int mask = 0; mask < 1<<b; mask++){
				int dnum = num;
				for(int i = 0; i < b; i++) if(mask&(1<<i))
					dnum ^= (1<<ind[1][i]);

				if(__builtin_popcount(mask)&1) sum -= sub[dnum];
				else sum += sub[dnum];
			}

			cout << sum << '\n';

		}else{
			
			int sum = 0;
			int num = 0;

			for(int i = 0; i < L; i++) if(T[i]=='1')
				num ^= (1<<i);

			for(int mask = 0; mask < 1<<c; mask++){
				int dnum = num;
				for(int i = 0; i < c; i++) if(mask&(1<<i))
					dnum ^= (1<<ind[2][i]);

				sum += S[dnum] - '0';
			}

			cout << sum << '\n';

		}
	}

}


signed main(){
	cin.tie(0)->sync_with_stdio(false);
	int t = 1;
	while(t--){solve();}
}
#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...