Pagini recente » Cod sursa (job #922895) | Cod sursa (job #2314716) | Cod sursa (job #3140533) | Cod sursa (job #2856439) | Cod sursa (job #549707)
Cod sursa(job #549707)
# include <fstream>
# define inf 1000000000
using namespace std;
ifstream f ("huffman.in");
ofstream g ("huffman.out");
long long int lb[1000005],l[1000005],n,lg,vf,ff,x,i,j;
bool s[1000005];
struct nod
{
long long int info,ap;
nod *st,*dr;
}*p,*v,*q;
class coada
{
int pr,ul;
nod *c[1000005];
public:
coada (){pr=1;ul=0;}
void push (nod *p);
void pop (nod *&p);
int appr ();
}c1,c2;
void coada::push (nod *p)
{
ul++;
c[ul]=p;
}
void coada::pop (nod *&p)
{
p=c[pr];
pr++;
}
int coada::appr ()
{
if (pr<=ul)
return c[pr]->ap;
else
return inf;
}
long long int transf ()
{
long long int x=0,i,ff=1;
for (i=vf-1;i>=1;i--)
{
x+=s[i]*ff;
ff*=2;
}
return x;
}
void df (nod *p)
{
vf++;
if (p->st)
{
s[vf]=0;
df (p->st);
}
if (p->dr)
{
s[vf]=1;
df (p->dr);
}
if (p->st==0 && p->dr==0)
{
l[p->info]=vf-1;
lb[p->info]=transf ();
}
else
lg+=p->ap;
vf--;
}
int main ()
{
f>>n;
for (i=1;i<=n;i++)
{
f>>x;
p=new nod;
p->info=i;
p->ap=x;
p->st=0;
p->dr=0;
c1.push (p);
}
for (i=1;i<n;i++)
{
p=new nod;
p->ap=0;
for (j=1;j<=2;j++)
if (c1.appr()<c2.appr())
{
c1.pop (q);
if (j==1)
p->st=q;
else
p->dr=q;
p->ap+=q->ap;
}
else
{
c2.pop (q);
if (j==1)
p->st=q;
else
p->dr=q;
p->ap+=q->ap;
}
c2.push (p);
}
v=p;
df (v);
g<<lg<<"\n";
for (i=1;i<=n;i++)
g<<l[i]<<" "<<lb[i]<<"\n";
return 0;
}