제출 #1174965

#제출 시각아이디문제언어결과실행 시간메모리
1174965iulia_morariu앵무새 (IOI11_parrots)C++17
컴파일 에러
0 ms0 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <cmath>
// #include "decoder.h"
// #include "decoderlib.h"
#include "encoder.h"
#include "encoderlib.h"
//#include <bits/stdc++.h>
#define in  cin
#define out cout

using namespace std;
const int B = 10; // baza

vector<short> ce_tr;
void send(int nr){
    ce_tr.push_back(nr);
}

vector<short> operator/(vector<short> & a, int b){
    int t = 0;
    vector<short> c;
    for(int i = a.size() - 1; i >= 0; i--){
        t = t * B + a[i];
        c.push_back(t / b);
        t %= b;
    }
    reverse(c.begin(), c.end());
    while(!c.empty() && c.back() == 0) c.pop_back();
    return c;
}

vector<short> operator+(vector<short> & a, vector<short> & b){
    int t = 0;
    vector<short> sl;
    for(int i = 0; i < max(a.size(), b.size()) || t > 0; i++){
        if(i < a.size()) t += a[i];
        if(i < b.size()) t += b[i];
        sl.push_back(t % B);
        t /= B;
    }
    return sl;
}

vector<short> operator-(vector<short> a, vector<short> & b){ // am grija ca a >= b
    vector<short> sl;
    for(int i = 0; i < a.size(); i++){
        if(i < b.size()) sl.push_back(a[i] - b[i]);
        else sl.push_back(a[i]);
        if(sl.back() < 0){
            sl[i] += B;
            a[i + 1]--;
        }
    }
    while(sl.size() > 1 && sl.back() == 0) sl.pop_back();
    return sl;
}

vector<short> operator*(vector<short> & a, vector<short> & b){
    vector<short> c(a.size() + b.size() - 1, 0);
    int t = 0;
    for(int i = 0; i < a.size(); i++){
        for(int j = 0; j < b.size(); j++){
            c[i + j] += a[i] * b[j];
        }
    }

    for(int i = 0; i <= a.size() + b.size() - 2 || t > 0; i++){
        if(i < c.size()){
            t += c[i];
            c[i] = t % B;
            t /= B;
        }else{
            c.push_back(t % B);
            t /= B;
        }
    }
    return c;
}

bool mai_mic_egal(vector<short> & a, vector<short> & b){
    if(a.size() != b.size()) return a.size() < b.size();
    for(int i = a.size() - 1; i >= 0; i--){
        if(a[i] != b[i]) return a[i] < b[i];
    }
    return a < b;
}

vector<short> dp[5 * 64 + 1][256];

void calculeaza_dp(int n){
    // cerr << "INTRAT\n";
    // dp[i][j] = cate siruri sunt de i elemente cu ultimul elemnt j
    for(int i = 0; i <= 5 * n; i++){
        for(int j = 0; j <= 255; j++){
            dp[i][j].clear();
            dp[i][j].push_back(0);
        }
    }

    for(int j = 0; j <= 255; j++){
        dp[1][j][0] = 1;
    }

    for(int i = 2; i <= 5 * n; i++){
        for(int j = 0; j <= 255; j++){
            dp[i][j] = dp[i - 1][j];
            if(j > 0) dp[i][j] = dp[i][j] + dp[i][j - 1];
        }
    }
    // cerr << "IESIT\n";
}

void encode(int N, int M[]){
    vector<bool> b;
    for(int i = 0; i < N; i++){
        int cnt = 0;
        while(M[i]){
            b.push_back(M[i] % 2);
            M[i] /= 2;
            cnt++;
        }
        while(cnt < 8){ b.push_back(0); cnt++; }
    }

    // cout << "b : "; // bunbun
    // for(int i = 0; i < b.size(); i++) cout << b[i];
    // cout << '\n';

    vector<short> nr;
    nr.push_back(0);
    vector<short> P; P.push_back(1); // 2 ^ ceva
    vector<short> doi; doi.push_back(2); // 2

    for(int i = b.size() - 1; i >= 0; i--){
        if(b[i]) nr = nr + P;
        P = P * doi;
    }

    calculeaza_dp(N);
    // nr.clear();
    // nr.push_back(1);
    // cout << "nr : ";
    // for(int i = nr.size() - 1; i >= 0; i--) cout << nr[i];
    // cout << '\n';

    int last = 255;
    vector<short> sending; // ce send 
    for(int i = 5 * N; i >= 1; i--){
        // cout << "i = " << i << " nr = ";
        // for(int j = nr.size() - 1; j >= 0; j--) cout << nr[j];
        // cout << '\n';
        for(int c = 0; c <= last; c++){
            if(mai_mic_egal(nr, dp[i][c])){
                sending.push_back(c);
                last = c;
                break;
            }
            nr = nr - dp[i][c];
        }
    }
    // cout << "Osa send : ";
    // for(int i = 0; i < sending.size(); i++) cout << sending[i] << " ";
    // cout << '\n';
    for(int i = 0; i < sending.size(); i++) send( sending[i] );
}
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <cmath>
#include "decoder.h"
#include "decoderlib.h"
// #include "encoder.h"
// #include "encoderlib.h"
//#include <bits/stdc++.h>
#define in  cin
#define out cout

using namespace std;
const int B = 10; // baza

vector<short> ce_tr;
void send(int nr){
    ce_tr.push_back(nr);
}

vector<short> operator/(vector<short> & a, int b){
    int t = 0;
    vector<short> c;
    for(int i = a.size() - 1; i >= 0; i--){
        t = t * B + a[i];
        c.push_back(t / b);
        t %= b;
    }
    reverse(c.begin(), c.end());
    while(!c.empty() && c.back() == 0) c.pop_back();
    return c;
}

vector<short> operator+(vector<short> & a, vector<short> & b){
    int t = 0;
    vector<short> sl;
    for(int i = 0; i < max(a.size(), b.size()) || t > 0; i++){
        if(i < a.size()) t += a[i];
        if(i < b.size()) t += b[i];
        sl.push_back(t % B);
        t /= B;
    }
    return sl;
}

vector<short> operator-(vector<short> a, vector<short> & b){ // am grija ca a >= b
    vector<short> sl;
    for(int i = 0; i < a.size(); i++){
        if(i < b.size()) sl.push_back(a[i] - b[i]);
        else sl.push_back(a[i]);
        if(sl.back() < 0){
            sl[i] += B;
            a[i + 1]--;
        }
    }
    while(sl.size() > 1 && sl.back() == 0) sl.pop_back();
    return sl;
}

vector<short> operator*(vector<short> & a, vector<short> & b){
    vector<short> c(a.size() + b.size() - 1, 0);
    int t = 0;
    for(int i = 0; i < a.size(); i++){
        for(int j = 0; j < b.size(); j++){
            c[i + j] += a[i] * b[j];
        }
    }

    for(int i = 0; i <= a.size() + b.size() - 2 || t > 0; i++){
        if(i < c.size()){
            t += c[i];
            c[i] = t % B;
            t /= B;
        }else{
            c.push_back(t % B);
            t /= B;
        }
    }
    return c;
}

bool mai_mic_egal(vector<short> & a, vector<short> & b){
    if(a.size() != b.size()) return a.size() < b.size();
    for(int i = a.size() - 1; i >= 0; i--){
        if(a[i] != b[i]) return a[i] < b[i];
    }
    return a < b;
}

vector<short> dp[5 * 64 + 1][256];

void calculeaza_dp(int n){
    // cerr << "INTRAT\n";
    // dp[i][j] = cate siruri sunt de i elemente cu ultimul elemnt j
    for(int i = 0; i <= 5 * n; i++){
        for(int j = 0; j <= 255; j++){
            dp[i][j].clear();
            dp[i][j].push_back(0);
        }
    }

    for(int j = 0; j <= 255; j++){
        dp[1][j][0] = 1;
    }

    for(int i = 2; i <= 5 * n; i++){
        for(int j = 0; j <= 255; j++){
            dp[i][j] = dp[i - 1][j];
            if(j > 0) dp[i][j] = dp[i][j] + dp[i][j - 1];
        }
    }
    // cerr << "IESIT\n";
}

void decode(int N, int L, int X[]){
    calculeaza_dp(N);
    sort(X + 0, X + L);

    // cout << "primesc X : ";
    // for(int i = 0; i < L; i++) cout << X[i] << " ";
    // cout << '\n';

    // cout << "dp[2][0] = ";
    // for(int k = dp[2][0].size() - 1; k >= 0; k--) cout << dp[2][0][k];
    // cout << '\n';

    vector<short> nr; nr.push_back(0);
    for(int i = 1; i <= L; i++){
        for(int j = 0; j < X[i - 1]; j++){
            nr = nr + dp[i][j];
        }
    }

    // cout << "nr : ";
    // for(int i = nr.size() - 1; i >= 0; i--) cout << nr[i];
    // cout << '\n';

    vector<bool> b;
    while(!nr.empty() && nr.back() > 0){
        // cout << "nr : ";
        // for(int i = nr.size() - 1; i >= 0; i--) cout << nr[i];
        // cout << '\n';
        b.push_back(nr[0] % 2);
        nr = (nr / 2);
    }
    while(b.size() != 8 * N) b.push_back(0);
    reverse(b.begin(), b.end());

    // cout << "b : ";
    // for(int i = 0; i < b.size(); i++) cout << b[i];
    // cout << '\n';

    vector<short> jucu;
    for(int i = 0; i < b.size(); i += 8){
        int x = 0;
        for(int j = 0; j < 8; j++){
            x = x + (1 << j) * b[i + j];
        }
        jucu.push_back(x);
    }
    // cout << "M este : ";
    // for(int i = 0; i < jucu.size(); i++) cout << jucu[i] << " ";
    // cout << '\n';
    for(int i = 0; i < jucu.size(); i++) output(jucu[i]);
}

컴파일 시 표준 에러 (stderr) 메시지

# 1번째 컴파일 단계

/usr/bin/ld: /tmp/ccGV7P3v.o: in function `send(int)':
grader_encoder.cpp:(.text+0xa0): multiple definition of `send(int)'; /tmp/ccku9lYr.o:encoder.cpp:(.text+0xa40): first defined here
collect2: error: ld returned 1 exit status