답안 #677391

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
677391 2023-01-03T07:33:15 Z Cross_Ratio 기억 압축 (JOI15_memory) C++14
0 / 100
0 ms 212 KB
#include "Memory_lib.h"
#include <bits/stdc++.h>
using namespace std;
int pw[25];
int val(int s, int e, int M) {
    int val = 0, cnt = 1;
    for(int i=s;i<e;i++) {
        val += (M & pw[i])/pw[i] * cnt;
        cnt *= 2;
    }
    return val;
}
/*string s;
char Get(int v) {
    cout << v << ' ';
    assert(1<=v&&v<=s.length());
    return s[v-1];
}*/
int Memory(int N, int M) {
    int i;
    pw[0] = 1;
    for(i=1;i<=23;i++) pw[i] = pw[i-1] * 2;
    int st = val(0, 7, M);
    int pt = val(7, 14, M);
    int cnt = val(14, 21, M);
    int k = val(21, 22, M);
    //cout << st << ' ' << pt << ' ' << cnt << ' ' << k << '\n';
    if(st==pt) {
        //assert(1<=st+1&&st+1<=N);
        char c = Get(st+1);
        if(c=='<' || c=='[') {
            if(st+1>=N) return -2;
            int v = st + pw[7] * (st+1) + pw[14] * 1 + pw[21] * (c=='<'?1:0);
            return v;
        }
        else {
            if(st-1<0) return -2;
            int v = st + pw[7] * (st - 1) + pw[14] * 1 + pw[21] * (c=='>'?1:0);
            return v;
        }
    }
    char c = Get(pt+1);
    assert(1<=pt+1);
    if(c=='<'||c=='[') {
        if(st < pt) {
            if(pt+1>=N) return -2;
            int v = st + pw[7] * (pt + 1) + pw[14] * (cnt + 1) + pw[21] * k;
            return v;
        }
        else { // pt < st case
            if(cnt==1) {
                int k2 = (c=='<'?1:0);
                if(k==k2) {
                    if(st+1>=N) return -1;
                    int v = st+1 + pw[7] * (st+1) + pw[14] * 0 + pw[21] * 0;
                    return v;
                }
                else return -2;
            }
            else {
                if(pt-1<0) return -2;
                int v = st + pw[7] * (pt - 1) + pw[14] * (cnt - 1) + pw[21] *k;
                return v;
            }
        }
    }
    else { // c == '>' || c == ']'
        if(st<pt) {
            if(cnt==1) {
                int k2 = (c=='>'?1:0);
                if(k==k2) {
                    if(st+1>=N) return -1;
                    int v = st+1 + pw[7] * (st+1) + pw[14] * 0 + pw[21] * 0;
                    return v;
                }
                else return -2;
            }
            else {
                if(pt+1>=N) return -2;
                int v = st + pw[7] * (pt+1) + pw[14] * (cnt-1) + pw[21] * k;
                return v;
            }
        }
        else { // pt < st
            if(pt-1<0) return -2;
            int v = st + pw[7] * (pt-1) + pw[14] * (cnt+1) + pw[21] * k;
            return v;
        }
    }
}
/*
signed main() {
    cin >> s;
    int cnt = 15000;
    int M = 0;
    while(cnt--) {
        M = Memory(s.length(), M);
        cout << M << '\n';
        if(M==-1) cout << "Right\n";
        else if(M==-2) cout << "Wrong\n";
        if(M==-1||M==-2) break;
    }
}
*/
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [1]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -