제출 #1130204

#제출 시각아이디문제언어결과실행 시간메모리
1130204iframe_Snake Escaping (JOI18_snake_escaping)C++20
22 / 100
312 ms26020 KiB
#include <algorithm>
#include <iostream>
#include <array>

int *a[21], d[1<<21];

using ll = long long;

std::array<ll, 2> b[1000000];
int res[1000000];

void dfs(int l, int r, int d, int p, int s){
	if(s == 1)
		for(; l<r; ++l) res[b[l][1]] = a[d][0];

	else{
		int s1 = r, s2 = r;

		for(int i=r-1; i>=l; --i){
			if(((b[i][0] >> (p*2)) & 3) >= 2) s2 = i;
			if(((b[i][0] >> (p*2)) & 3) >= 1) s1 = i;
		}

		if(l != s1){
			for(int i=0; i<s/2; ++i)
				a[d+1][i] = a[d][i];
			dfs(l, s1, d+1, p-1, s/2);
		}

		if(s1 != s2){
			for(int i=0; i<s/2; ++i)
				a[d+1][i] = a[d][i+s/2];
			dfs(s1, s2, d+1, p-1, s/2);
		}

		if(s2 != r){
			for(int i=0; i<s/2; ++i)
				a[d+1][i] = a[d][i+s/2];
			for(int i=0; i<s/2; ++i)
				a[d+1][i] += a[d][i];
			dfs(s2, r, d+1, p-1, s/2);
		}
	}
}

int main(){
	std::cin.tie(0) -> sync_with_stdio(0);

	int l, q; std::cin >> l >> q;

	a[0] = d;
	for(int s=1<<l, p=1; s; ++p, s/=2)
		a[p] = a[p-1]+s;

	for(int i=0; i<1<<l; ++i){
		char c; std::cin >> c;
		a[0][i] = c-'0';
	}

	for(int i=0; i<q; ++i){
		b[i][1] = i;
		for(int j=0; j<l; ++j){
			char c; std::cin >> c;
			int m = c == '?' ? 2 : c - '0';
			b[i][0] |= m << ((l-j-1)*2);
		}
	}

	std::sort(b, b+q);

	dfs(0, q, 0, l-1, 1<<l);

	for(int i=0; i<q; ++i) std::cout << res[i] << " \n"[i==q-1];
}
#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...