Mai intai trebuie sa te autentifici.
Cod sursa(job #1312961)
Utilizator | Data | 10 ianuarie 2015 10:52:33 | |
---|---|---|---|
Problema | Sortare prin comparare | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.77 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)
{
a[0]=0;
for(int j=-1; j<9; ++j, p[j]=u[j]=new nod, p[j]->inf=INF);
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 i=1; i<=a[0]; ++i)
printf("%d ", a[i]);
fclose(stdin);
fclose(stdout);
return 0;
}