Submission #1290868

#TimeUsernameProblemLanguageResultExecution timeMemory
1290868Jawad_Akbar_JJSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1651 ms21744 KiB
#include <iostream>

using namespace std;
const int N = 1<<20;
int sub[N], sup[N], cnt[N];
string s, ss;

int main(){
	int l, q, pw[] = {1, -1};
	cin>>l>>q>>s;

	for (int i=0;i<(1<<l);i++){
		sub[i] = sup[i] = s[i] - '0';
		cnt[i] = __builtin_popcount(i);
	}

	for (int i=0;i<l;i++){
		for (int m=0;m<(1<<l);m++)
			if ((1<<i) & m)
				sub[m] += sub[m ^ (1<<i)];
			else
				sup[m] += sup[m ^ (1<<i)];
	}

	for (int i=0;i<q;i++){
		cin>>ss;
		int A = 0, B = 0, C = 0, Ans = 0;
		for (int j=0;j<l;j++){
			if (ss[l - j - 1] == '0')
				A |= (1<<j);
			if (ss[l - j - 1] == '1')
				B |= (1<<j);
			if (ss[l - j - 1] == '?')
				C |= (1<<j);
		}

		if (cnt[C] <= 6){
			Ans = s[B] - '0';
			for (int m = C; m; m = (m - 1) & C)
				Ans += s[m | B] - '0';
		}
		else if (cnt[A] <= 6){
			Ans = sup[B];
			for (int m = A; m; m = (m - 1) & A)
				Ans += sup[B | m] * pw[cnt[m] & 1];
		}
		else{
			Ans = sub[C] * pw[cnt[B] & 1];
			for (int m = B; m; m = (m - 1) & B)
				Ans += sub[C | m] * pw[cnt[B ^ m] & 1];
		}

		cout<<Ans<<'\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...