Cod sursa(job #1313345)

Utilizator cristigrigoreGrigore Cristan Andrei cristigrigore Data 10 ianuarie 2015 16:11:36
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>

using namespace std;
int i,j,m,n,a[10000000],b[10000000],k=1,o[12],l,N,A,B,C,Max,l1,z,Z;
bool ok[10];
struct nod
{
    int inf;
    nod *leg;
};
nod *p[10],*q,*prim,*u[10];
void push(int k,int x)
{
    nod *q;
    if(!ok[k])
    {
        p[k]=new nod;
        p[k]->inf=x;
        p[k]->leg=NULL;
        u[k]=p[k];
        ok[k]=true;
    }
    else
    {
        q=new nod;
        q->inf=x;
        q->leg=NULL;
        u[k]->leg=q;
        u[k]=q;

    }
}
void cauta(int i)
{
    nod *q;
    q=p[i];
    while(q->leg!=NULL)
    {
        a[++l]=q->inf;
        q=q->leg;
    }
    a[++l]=q->inf;
}
int main()
{
    freopen("radixsort.in","r",stdin);
    freopen("radixsort.out","w",stdout);
    scanf("%d %d %d %d",&N,&A,&B,&C);
    a[1]=B;
    for(i=2; i<=N; i++)
    {
        a[i] = (A * a[i-1] + B) % C;
        if(a[i]>Max)Max=a[i];
    }Z=N;
    while(Max>k)
    {
        k*=10;
        for(i=1; i<=N; i++)
        {
            if(a[i]>=k/10)
            push((a[i]/(k/10))%10,a[i]);
            else if(a[i]>=0){b[++l1]=a[i];a[i]=-1;z++;}
        }
        for(i=0; i<10; i++)
        {
            if(ok[i])
            {
               cauta(i);
            }

        }
        l=0;N-=z;z=0;
        for(i=0; i<10; i++)
        ok[i]=false;
    }
    for(i=1; i<=Z; i++)
    if(a[i]>=0) b[++l1]=a[i];
    for(i=1; i<=Z; i+=10)
        printf("%d ",b[i]);
    printf("\n");
        return 0;
    }