제출 #158880

#제출 시각아이디문제언어결과실행 시간메모리
158880ioaneSnake Escaping (JOI18_snake_escaping)C++14
5 / 100
2053 ms65536 KiB
#include<bits/stdc++.h>
#define F first
#define S second
#define LL int
#define MP make_pair
#define PB push_back
#define I insert

const LL N = 1600000;

using namespace std;

LL n, m, i, j, k, l, r, t, x, y, w, ans;
LL a[N], dp[130][N], x3[20];
char c;

int main(){
	x3[0] = 1;
	for ( i = 1; i < 20; ++i ){
		x3[i] = x3[i-1] * 3;
	}
	
	cin >> n >> m;
	for ( i = 0; i < (1<<n); ++i ){
		cin >> c;
		a[i] = c - '0';
	}
	k = min(n,13);
	for ( w = 0; w < (1<<(n-k)); ++w ){
		for ( i = 0; i < x3[k]; ++i ){
			t = i;
			l = 0;
			for ( j = 0; j < k; ++j ){
				r = t % 3;
				if ( r == 2 ){
					dp[w][i] = dp[w][i - x3[j]] + dp[w][i - 2*x3[j]];
					l = -100;
					break;
				}
				l += (1<<(j)) * r;
				t /= 3;
			}
			if ( l >= 0 ){
				dp[w][i] = a[l+(w<<(k))];
			}
			
			//cout << i << " " << dp[i] << "  " << l << endl;
		}
	}
	
	while ( m-- ){
		t = 0;
		for ( i = 0; i < k; ++i ){
			cin >> c;
			t *= 3;
			if ( c == '?' ) t += 2;
			else t += c - '0';
		}
		ans = 0;
		for ( i = 0; i < (1<<(n-k)); ++i ){
			ans += dp[i][t];
		}
		cout << ans << endl;
	}
	
	return 0;
}
#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...