Cod sursa(job #1474320)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 21 august 2015 19:42:11
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define NMAX 10000007
#define msk (1<<16) - 1

using namespace std;
FILE *fin, *fout;
int n, a, b, c, v[NMAX];
struct cntsort
{
    vector<int> mem;
    int sze;
} cntsort[msk+7];

int bucket(int nr, int x)
{
    nr>>=((x-1)*16);
    return nr&msk;
}

void citire()
{
    scanf("%d %d %d %d", &n, &a, &b, &c);
    v[1] = b;
    for(int i = 2; i<= n; ++i)
    {
        v[i] = (1LL*a*v[i-1] + b)%c;
    }
}
void radix(int st, int dr, int lvl)
{
    if(lvl == 0) return ;
    int tmp;
    //memset(cntsort, 0, sizeof(cntsort));
    for(int i = 0; i<= msk; ++i)
    {
        cntsort[i].sze = 0;
        cntsort[i].mem.clear();
    }
    for(int i = st; i<= dr; ++i)
    {
        tmp = bucket(v[i], lvl);
        cntsort[tmp].sze++;
        cntsort[tmp].mem.push_back(v[i]);
    }
    tmp = st;
    for(int i = 0; i<= msk; ++i)
    {
        for(int j = 0; j< cntsort[i].sze; ++j)
        {
            v[tmp] = cntsort[i].mem[j];
            tmp++;
        }
    }
    if(tmp != dr + 1) printf("check\n");
    ///selectie
    int start = st, fin;
    for(int i = st; i<= dr; ++i)
    {
        if(i == dr)
        {
            fin = i;
            radix(start, fin, lvl-1);
            break;
        }
        if(bucket(v[i+1], lvl) != bucket(v[i], lvl))
        {
            fin = i;
            radix(start, fin, lvl-1);
            start = i+1;
        }
    }
}
void afisare()
{
    for(int i = 1; i<= n; i+=10)
    {
        printf("%d ", v[i]);
    }
    printf("\n");
}

int main()
{
    fin = freopen("radixsort.in", "r", stdin);
    fout = freopen("radixsort.out", "w", stdout);
    citire();
    radix(1, n, 2);
    afisare();
    fclose(fin);
    fclose(fout);
    return 0;
}