Cod sursa(job #1312987)

Utilizator OnimushaLordTiberiu Copaciu OnimushaLord Data 10 ianuarie 2015 11:12:38
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
# include <cstdio>
# define DIM (1<<16)
# define N 500000 + 5
# define INF 2000000000

using namespace std;

struct nod
{
    int inf;
    nod *leg;
}*p[10],*u[10],*q;

int a[N],poz,n,list;
char buff[DIM];

void citeste(int &numar)
{
    numar = 0;

    while (buff[poz] < '0' || buff[poz] > '9')

        if (++poz == DIM)
            fread(buff,1,DIM,stdin),poz=0;

    while ('0'<=buff[poz] && buff[poz]<='9')
    {
        numar = numar*10 + buff[poz] - '0';
        if (++poz == DIM)
            fread(buff,1,DIM,stdin),poz=0;
    }
}

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

    citeste(n);
    for(int i=0; i<n; ++i, citeste(a[i]));
    int div=1;

    for(int i=0; i<10; ++i)
        p[i]=u[i]=new nod;

    for(int i=0; i<10; ++i)
    {
        a[0]=0;
        for(int j=-1; j<9; ++j, p[j]->inf=INF, u[j]=p[j]);
        for(int j=1; j<=n; ++j)
        {
            list=a[j]/div%10;
            if(p[list]->inf==INF)
            {
                p[list]->inf=a[j];
                p[list]->leg=NULL;
                u[list]=p[list];
            }
            else
            {
                q=new nod;
                q->inf=a[j];
                q->leg=NULL;
                u[list]->leg=q;
                u[list]=q;
            }
        }
        for(int j=0; j<10; ++j)
        {
            q=p[j];
            if(q->inf!=INF)
            {
                while(q->leg!=NULL)
                {
                    a[++a[0]]=q->inf;
                    q=q->leg;

                }
                a[++a[0]]=q->inf;
            }

        }
        div*=10;
        for(int j=0; j<10; ++j)
           if(p[j]->inf!=INF)
            while(p[j]->leg!=NULL)
            {
                q=p[j];
                p[j]=p[j]->leg;
                delete q;
            }
    }
    for(int i=1; i<=a[0]; ++i)
        printf("%d ", a[i]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}