Cod sursa(job #1315790)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 13 ianuarie 2015 09:00:57
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<cstdio>

using namespace std;

struct nod
{
    int inf;
    nod *leg;
};

int v[1000003],n,a,b,c,div,i,j,k,x,nr[10];
nod *q;

void reinit(nod *p[10])
{
    nod *q,*aux;
    for(int i=0;i<=9;i++)
    {
        q=p[i];
        for(int j=1;j<=nr[i];j++)
        {
            if(q->leg!=NULL)
            aux=q->leg;
            q=new nod;
            q=aux;
        }
    }
}

void reinit2(nod *p[10])
{
    for(int i=0;i<=9;i++)
    {
        delete p[i];
    }
}

int main()
{
    freopen("radixsort.in","r",stdin);
    freopen("radixsort.out","w",stdout);
    scanf("%d%d%d%d",&n,&a,&b,&c);
    v[1]=b;
    for(i=2;i<=n;i++)
    {
        v[i]=(1LL*a*v[i-1]+b)%c;
    }
    div=1;
    nod *p[10],*u[10];
    for(i=0;i<=10;i++)
    {
        reinit(p);
        for(j=0;j<=9;j++)
        {
            p[j]=new nod;
            u[j]=new nod;
            nr[j]=0;
        }
        for(j=1;j<=n;j++)
        {
            q=new nod;
            x=(v[j]/div)%10;
            if(nr[x]==0)
            {
                p[x]->inf=v[j];
                p[x]->leg=NULL;
                u[x]=p[x];
                nr[x]=1;
            }
            else
            {
                q->inf=v[j];
                q->leg=NULL;
                u[x]->leg=q;
                u[x]=q;
                nr[x]++;
            }
        }
        v[0]=0;
        for(j=0;j<=9;j++)
        {
            q=p[j];
            for(k=1;k<=nr[j];k++)
            {
                v[v[0]+k]=q->inf;
                q=q->leg;
            }
            v[0]+=nr[j];
        }
        div*=10;
    }
    for(i=1;i<=n;i+=10)
    {
        printf("%d ",v[i]);
    }
}