답안 #886841

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
886841 2023-12-13T03:39:33 Z socho Snake Escaping (JOI18_snake_escaping) C++14
5 / 100
297 ms 65540 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef double D;
typedef vector<int> VI;
typedef set<int> SI;
typedef map<int, int> MII;
typedef pair<int, int> PII;

#define A first
#define B second
#define SZ(x) int(x.size())
#define PB push_back
#define FR(i, a, b) for (int i = (a); i < (b); i++)
#define FOR(i, n) FR(i, 0, n)
#define RF(i, a, b) for (int i = (a); i >= (b); i--)
#define FRA(a, x) for (auto a: (x))

template <typename T> inline void set_min(T &a, T b) {if(b < a) a = b;}
template <typename T> inline void set_max(T &a, T b) {if(b > a) a = b;}

int n, q;
string s;
const int MXN = 20;
int dp[MXN][1<<MXN];
int dp2[MXN][1<<MXN];
int val[1<<MXN];

signed main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	
	cin >> n >> q;
	cin >> s;
	
	FOR(i, 1<<n) {
		val[i] = (s[i] - '0');
	}
	
	FOR(b, MXN) {
		FOR(i, 1<<n) {
			if (b == 0) {
				dp[b][i] = ((i & (1 << b)) > 0 ? val[i] + val[i ^ (1<<b)] : val[i]);
				dp2[b][i] = ((i & (1 << b)) == 0 ? val[i] + val[i ^ (1<<b)] : val[i]);
			}
			else {
				dp[b][i] = ((i & (1 << b)) > 0 ? dp[b-1][i] + dp[b-1][i ^ (1<<b)] : dp[b-1][i]);
				dp2[b][i] = ((i & (1 << b)) == 0 ? dp2[b-1][i] + dp2[b-1][i ^ (1<<b)] : dp2[b-1][i]);
			}
		}
	}
	
	FOR(_, q) {
		string s;
		cin >> s;
		reverse(s.begin(), s.end());
		
		int n0 = 0, n1 = 0, nq = 0;
		FRA(x, s) {
			if (x == '?') nq++;
			else if (x == '0') n0++;
			else n1++;
		}
		
		int ans = 0;
		if (nq <= 6) {
			// just add over the bitmasks
			int main = 0;
			VI ms;
			FOR(i, n) {
				if (s[i] == '?') ms.PB(i);
				else if (s[i] == '1') main += (1 << i);
			}
			FOR(i, 1<<nq) {
				int p = main;
				FOR(j, nq) {
					if (i & (1 << j)) p += (1 << ms[j]);
				}
				ans += val[p];
			}
		}
		else if (n0 <= 6) {
			// 0011??
			// super(001100)
			// -super(011100)
			// -super(101100)
			// +super(111100)
			VI ms;
			int main = 0;
			FOR(i, n) {
				if (s[i] == '0') ms.PB(i);
				else if (s[i] == '1') main += (1 << i);
			}
			FOR(i, 1<<n0) {
				int p = main;
				FOR(j, n0) {
					if (i & (1 << j)) {
						p += (1 << ms[j]);
					}
				}
				if (__builtin_popcount(i) % 2 == 0) ans += dp2[n-1][p];
				else ans -= dp2[n-1][p];
			}
		}
		else { // n1 <= 6
			// 0011??
			// sub(001111)
			// -sub(001011)
			// -sub(000111)
			// +sub(000011)
			VI ms;
			int main = 0;
			FOR(i, n) {
				if (s[i] == '1') ms.PB(i);
				else if (s[i] == '?') main += (1 << i);
			}
			FOR(i, 1<<n1) {
				int p = main;
				FOR(j, n1) {
					if (i & (1 << j)) p += (1 << ms[j]);
				}
				if ((n1 - __builtin_popcount(i)) % 2 == 0) ans += dp[n-1][p];
				else ans -= dp[n-1][p];
			}
		}
		cout << ans << '\n';
		
	}
	
}
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 64092 KB Output is correct
2 Correct 8 ms 64092 KB Output is correct
3 Correct 7 ms 63976 KB Output is correct
4 Correct 8 ms 64088 KB Output is correct
5 Correct 8 ms 64216 KB Output is correct
6 Correct 8 ms 64092 KB Output is correct
7 Correct 8 ms 64116 KB Output is correct
8 Correct 7 ms 64092 KB Output is correct
9 Correct 7 ms 64092 KB Output is correct
10 Correct 8 ms 64092 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 64092 KB Output is correct
2 Correct 8 ms 64092 KB Output is correct
3 Correct 7 ms 63976 KB Output is correct
4 Correct 8 ms 64088 KB Output is correct
5 Correct 8 ms 64216 KB Output is correct
6 Correct 8 ms 64092 KB Output is correct
7 Correct 8 ms 64116 KB Output is correct
8 Correct 7 ms 64092 KB Output is correct
9 Correct 7 ms 64092 KB Output is correct
10 Correct 8 ms 64092 KB Output is correct
11 Runtime error 297 ms 65540 KB Execution killed with signal 9
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 64092 KB Output is correct
2 Correct 8 ms 64092 KB Output is correct
3 Correct 7 ms 63976 KB Output is correct
4 Correct 8 ms 64088 KB Output is correct
5 Correct 8 ms 64216 KB Output is correct
6 Correct 8 ms 64092 KB Output is correct
7 Correct 8 ms 64116 KB Output is correct
8 Correct 7 ms 64092 KB Output is correct
9 Correct 7 ms 64092 KB Output is correct
10 Correct 8 ms 64092 KB Output is correct
11 Runtime error 297 ms 65540 KB Execution killed with signal 9
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 64092 KB Output is correct
2 Correct 8 ms 64092 KB Output is correct
3 Correct 7 ms 63976 KB Output is correct
4 Correct 8 ms 64088 KB Output is correct
5 Correct 8 ms 64216 KB Output is correct
6 Correct 8 ms 64092 KB Output is correct
7 Correct 8 ms 64116 KB Output is correct
8 Correct 7 ms 64092 KB Output is correct
9 Correct 7 ms 64092 KB Output is correct
10 Correct 8 ms 64092 KB Output is correct
11 Runtime error 23 ms 65536 KB Execution killed with signal 9
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 64092 KB Output is correct
2 Correct 8 ms 64092 KB Output is correct
3 Correct 7 ms 63976 KB Output is correct
4 Correct 8 ms 64088 KB Output is correct
5 Correct 8 ms 64216 KB Output is correct
6 Correct 8 ms 64092 KB Output is correct
7 Correct 8 ms 64116 KB Output is correct
8 Correct 7 ms 64092 KB Output is correct
9 Correct 7 ms 64092 KB Output is correct
10 Correct 8 ms 64092 KB Output is correct
11 Runtime error 297 ms 65540 KB Execution killed with signal 9
12 Halted 0 ms 0 KB -