Cod sursa(job #1312983)
Utilizator | Data | 10 ianuarie 2015 11:07:32 | |
---|---|---|---|
Problema | Radix Sort | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 9.35 kb |
#include <cstdio>
using namespace std;
struct nod
{
long long int inf;
nod *leg;
};
nod *prim_a, *prim_0, *prim_1, *prim_2, *prim_3, *prim_4, *prim_5, *prim_6, *prim_7, *prim_8, *prim_9;
nod *u_0, *u_1, *u_2, *u_3, *u_4, *u_5, *u_6, *u_7, *u_8, *u_9;
long long int sol[10000001], maxcif;
int nrcif (int x)
{
int m=x, nr=0;
while (m>0)
{
m/=10;
nr++;
}
return nr;
}
int cif_i (int x, int i)
{
int m=x, nr=1;
while (m>0)
{
if (nr==i)
{
return m%10;
}
m/=10;
nr++;
}
}
nod *load (int n, int x, int y, int z)
{
long long int i, nr;
nod *p, *q, *u;
p=new nod; u=new nod;
p->inf=y; p->leg=NULL;
sol[1]=p->inf; u=p;
maxcif=nrcif(sol[1]);
for (i=2; i<=n; i++)
{
q=new nod;
q->inf=(x*(u->inf)+y)%z;
sol[i]=q->inf;
nr=nrcif(sol[i]);
if (nr>maxcif)
{
maxcif=nr;
}
u->leg=q; q->leg=NULL;
u=q;
}
return p;
}
int main()
{
long long int n, x, y, z, i, j, m, nr;
bool sel0, sel1, sel2, sel3, sel4, sel5, sel6, sel7, sel8, sel9;
nod *p, *q;
freopen("radixsort.in","r",stdin);
freopen("radixsort.out","w",stdout);
scanf("%lld%lld%lld%lld",&n,&x,&y,&z);
prim_a=new nod;
prim_a=load(n,x,y,z); q=prim_a;
for (i=1; i<=maxcif; i++)
{
sel0=false; sel1=false; sel2=false; sel3=false; sel4=false; sel5=false; sel6=false; sel7=false; sel8=false; sel9=false;
for (j=1; j<=n; j++)
{
q=new nod;
m=cif_i(sol[j],i);
if (m%10==0)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel0) {prim_0=q; sel0=true;}
if (u_0!=NULL) u_0->leg=q;
u_0=q;
}
else if (m%10==1)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel1) {prim_1=q; sel1=true;}
if (u_1!=NULL) u_1->leg=q;
u_1=q;
}
else if (m%10==2)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel2) {prim_2=q; sel2=true;}
if (u_2!=NULL) u_2->leg=q;
u_2=q;
}
else if (m%10==3)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel3) {prim_3=q; sel3=true;}
if (u_3!=NULL) u_3->leg=q;
u_3=q;
}
else if (m%10==4)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel4) {prim_4=q; sel4=true;}
if (u_4!=NULL) u_4->leg=q;
u_4=q;
}
else if (m%10==5)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel5) {prim_5=q; sel5=true;}
if (u_5!=NULL) u_5->leg=q;
u_5=q;
}
else if (m%10==6)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel6) {prim_6=q; sel6=true;}
if (u_6!=NULL) u_6->leg=q;
u_6=q;
}
else if (m%10==7)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel7) {prim_7=q; sel7=true;}
if (u_7!=NULL) u_7->leg=q;
u_7=q;
}
else if (m%10==8)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel8) {prim_8=q; sel8=true;}
if (u_8!=NULL) u_8->leg=q;
u_8=q;
}
else if (m%10==9)
{
q->inf=sol[j];
q->leg=NULL;
if (!sel9) {prim_9=q; sel9=true;}
if (u_9!=NULL) u_9->leg=q;
u_9=q;
}
}
q=new nod; nr=0;
q=prim_0;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_0->inf;
q=prim_1;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_1->inf;
q=prim_2;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_2->inf;
q=prim_3;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_3->inf;
q=prim_4;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_4->inf;
q=prim_5;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_5->inf;
q=prim_6;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_6->inf;
q=prim_7;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_7->inf;
q=prim_8;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_8->inf;
q=prim_9;
while (q->leg!=NULL)
{
sol[++nr]=q->inf;
q=q->leg;
} sol[++nr]=u_9->inf;
p=new nod;
q=prim_0;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_0;
q=prim_1;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_1;
q=prim_2;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_2;
q=prim_3;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_3;
q=prim_4;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_4;
q=prim_5;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_5;
q=prim_6;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_6;
q=prim_7;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_7;
q=prim_8;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_8;
q=prim_9;
while (q->leg!=NULL)
{
p=q;
q=q->leg;
delete p;
} delete u_9;
}
for (i=1; i<=n; i+=10)
{
printf("%d ",sol[i]);
}
fclose(stdin);
fclose(stdout);
return 0;
}