Cod sursa(job #828824)

Utilizator geniucosOncescu Costin geniucos Data 4 decembrie 2012 15:16:33
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int k,nrc,val,i,j,n,aux,xi,maxi,cif[20],ulc[20];
struct nod
{
    int nr;
    nod *urm[10];
    nod()
    {
        nr=0;
        memset(urm,0,sizeof(urm));
    }
};
nod *t,*p,*q[20];
vector < int > v[15];
////v[i] reprezinta sirul numerelor de i cifre ordonate crescator
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
scanf("%d",&n);
t=new nod;
for(i=1;i<=n;i++)
{
    scanf("%d",&xi);
    if(xi==0) printf("0 ");
    else
    {
        nrc=0;
        aux=xi;
        while(aux>0)
        {
            nrc++;
            cif[nrc]=aux%10;
            aux=aux/10;
        }
        p=t;
        if(nrc>maxi) maxi=nrc;
        for(j=nrc;j>=1;j--)
        {
            if(p->urm[cif[j]]==0) p->urm[cif[j]]=new nod;
            p=p->urm[cif[j]];
        }
        p->nr++;
    }
}
/////care au i1 cifre le caut in trie
//////////////////fac un BACK
q[0]=t;
val=0;
k=1;
ulc[1]=-1;
while(k>0)
{
    while(k<=maxi&&ulc[k]<9)
    {
        ulc[k]++;
        if(ulc[k]==0) val=val*10;
        else val++;
        if(q[k-1]->urm[ulc[k]]!=0)
        {
            q[k]=q[k-1]->urm[ulc[k]];
            if(val==-150)
                val=val;
            for(i=1;i<=q[k]->nr;i++)
                v[k].push_back(val);
            k++;
            ulc[k]=-1;
        }
    }
    if(ulc[k]!=-1) val=val/10;
    k--;
    if(k==1)
        k=k;
}
for(i=1;i<=maxi;i++)
    for(j=0;j<v[i].size();j++)
        printf("%d ",v[i][j]);
return 0;
}