# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
41088 | kriii | Snake Escaping (JOI18_snake_escaping) | C++14 | 865 ms | 21960 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <stdio.h>
int L,Q;
char sc[1<<20+2]; int bc[1<<20];
int Z[1<<20],O[1<<20];
void go(int l, int r)
{
if (l+1 == r) return;
int m = (l + r) / 2;
go(l,m);
go(m,r);
for (int i=l;i<m;i++){
Z[i-l+m] += Z[i];
O[i] += O[i-l+m];
}
}
int main()
{
scanf ("%d %d",&L,&Q);
scanf ("%s",sc);
for (int i=0;i<(1<<L);i++){
if (i) bc[i] = bc[i-(i&(-i))] + 1;
Z[i] = O[i] = sc[i] - '0';
}
go(0,(1<<L));
while (Q--){
char q[22]; scanf ("%s",q);
int z = 0, o = 0, f = 0;
for (int i=0;i<L;i++){
if (q[i] == '0') z |= 1 << (L - i - 1);
if (q[i] == '1') o |= 1 << (L - i - 1);
if (q[i] == '?') f |= 1 << (L - i - 1);
}
int ans = 0;
if (bc[f] <= 7){
for (int x=f;;x=(x-1)&f){
ans += sc[x|o] - '0';
if (!x) break;
}
}
else if (bc[o] <= 7){
for (int x=o;;x=(x-1)&o){
int b = f + x;
if (bc[o] % 2 != bc[x] % 2) ans -= Z[b];
else ans += Z[b];
if (!x) break;
}
}
else{
for (int x=z;;x=(x-1)&z){
int b = o + z - x;
if (bc[z] % 2 != bc[x] % 2) ans -= O[b];
else ans += O[b];
if (!x) break;
}
}
printf ("%d\n",ans);
}
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... |