# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
43291 | funcsr | Snake Escaping (JOI18_snake_escaping) | C++14 | 2032 ms | 65536 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <cassert>
#include <bitset>
using namespace std;
typedef pair<int, int> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define index(xs, x) (int)(lower_bound(all(xs), x) - xs.begin())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007
int L, Q;
char IN[(1<<20)+1];
int A[1<<20], B[1<<20], C[1<<20];
signed main() {
scanf("%d %d", &L, &Q);
scanf("%s", IN);
rep(i, 1<<L) A[i] = (int)(IN[i]-'0');
rep(i, 1<<L) B[i] = A[i], C[((1<<L)-1)^i] = A[i];
rep(add, L) rep(S, 1<<L) if (((S>>add)&1)==0) B[S|(1<<add)] += B[S];
rep(add, L) rep(S, 1<<L) if (((S>>add)&1)==0) C[S|(1<<add)] += C[S];
rep(q, Q) {
char qs[21];
scanf("%s", qs);
reverse(qs, qs+L);
int zero = 0, one = 0, any = 0;
rep(i, L) {
if (qs[i] == '0') zero++;
else if (qs[i] == '1') one++;
else any++;
}
int s = 0;
if (any <= 6) {
int mask = 0;
vector<int> sub;
rep(i, L) {
if (qs[i] == '?') sub.pb(1<<i);
if (qs[i] == '1') mask |= 1<<i;
}
rep(w, 1<<sub.size()) {
int id = mask;
rep(i, sub.size()) if ((w>>i)&1) id += sub[i];
s += A[id];
}
}
else if (one <= 6) {
int mask = 0;
vector<int> sub;
rep(i, L) {
if (qs[i] == '1') sub.pb(1<<i);
if (qs[i] == '?') mask |= 1<<i;
}
rep(w, 1<<sub.size()) {
int id = mask, sgn = 1;
rep(i, sub.size()) {
if ((w>>i)&1) id += sub[i];
else sgn *= -1;
}
s += sgn*B[id];
}
}
else {
assert(zero <= 6);
int mask = 0;
vector<int> sub;
rep(i, L) {
if (qs[i] == '0') sub.pb(1<<i);
if (qs[i] == '?') mask |= 1<<i;
}
rep(w, 1<<sub.size()) {
int id = mask, sgn = 1;
rep(i, sub.size()) {
if ((w>>i)&1) id += sub[i];
else sgn *= -1;
}
s += sgn*C[id];
}
}
printf("%d\n", s);
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |