Cod sursa(job #2222448)

Utilizator inquisitorAnders inquisitor Data 16 iulie 2018 23:53:48
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <cstdio>
#include <algorithm>

__attribute__((always_inline)) void CountingSort(size_t N, size_t A[], size_t B[], size_t digit)
{
    size_t frequence[0x800]{}, index[0x800]; index[0x0] = ~0x0;

    for(size_t i = N; i; ++frequence[A[--i] >> digit & 0x7FF]);

    for(size_t i = 0x0; i != 0x7FF; index[++i] = index[~-i] + frequence[~-i]);

    for(size_t i = 0x0; i != N; ++i) B[++index[A[i] >> digit & 0x7FF]] = A[i];
}

#define BUFFER_SIZE 5000000

char buffer[BUFFER_SIZE], *head = buffer, *writeHead = buffer;

bool isDigit[0xFF];

void parse()
{
    buffer[fread(buffer, 0x1, BUFFER_SIZE, stdin)] = 0x0;

    for(int i = 0x2F; i < 0x3A; ++i) isDigit[i] = 0x1;
}

__attribute__((always_inline)) int get_int()
{
    int number = 0x0;

    for(; !isDigit[*head]; ++head);

    for(;  isDigit[*head]; ++head)

        number = number * 0xA + (*head) - 0x30;

    return number;
}

__attribute__((always_inline)) void put_int(int x)
{
    if(x == 0x0)
    {
        *(writeHead++) = 0x30; *(writeHead++) = 0x20;

        return;
    }

    if(x < 0x0)
    {
        *(writeHead++) = 0x2D; *(writeHead++) = 0x31; *(writeHead++) = 0x20;

        return;
    }

    char *old = writeHead;

    while(x)
    {
        *(writeHead++) = x % 0xA + 0x30;

        x /= 0xA;
    }

    std::reverse(old, writeHead);

    *(writeHead++) = 0x20;
}

int main()
{
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);

    parse();

    size_t N, v[0x80000], w[0x80000]; ///declara vectorii global daca iei (0xC00000FD)

    N = get_int();

    for(size_t i = N; --i;)
    {
        v[i] = get_int();
    }

    v[0x0] = get_int();

    CountingSort(N, v, w, 0x0);
    CountingSort(N, w, v, 0xB);
    CountingSort(N, v, w, 0x16);

    for(size_t i = 0x0; i != N; ++i)
    {
        put_int(w[i]);
    }

    fwrite(buffer, 0x1, writeHead - buffer, stdout);

    return 0x0;
}