Pagini recente » Cod sursa (job #1216749) | Istoria paginii runda/simulare_oji_11_12_1/clasament | Cod sursa (job #865331) | Cod sursa (job #2765943) | Cod sursa (job #1105787)
#include<fstream>
#include<cstring>
#define NMAX 1000005
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n,Q1[NMAX],Q2[NMAX],Level[2*NMAX],L1=1,L2=1,Son[2*NMAX][2],nr;
long long F[2*NMAX],Cod[2*NMAX],sol;
const int SZ=8192;
char buffer[SZ+1],*in,output[SZ+1],*out,snr[50];
inline int atoi()
{
int nr=0;
for(;*in && *in<'0';in++);
if(in==buffer+SZ)
{
fin.read(buffer,SZ);
in=buffer;
}
for(;*in>='0';in++)
{
nr=nr*10+(*in-'0');
if(in+1==buffer+SZ)
{
fin.read(buffer,SZ);
in=buffer-1;
}
}
return nr;
}
inline int pop()
{
if(F[Q1[L1]]<F[Q2[L2]])
return Q1[L1++];
return Q2[L2++];
}
inline void DFS(int nod,int Niv,long long C)
{
if(Son[nod][0])
{
DFS(Son[nod][0],Niv+1,(C<<1));
DFS(Son[nod][1],Niv+1,(C<<1)+1);
}
Level[nod]=Niv;
Cod[nod]=C;
}
inline void itos(long long x,bool sw)
{
if(!x)
{
if(sw)
*out++='0';
return;
}
itos(x/10,sw);
*out++=x%10+'0';
}
void print()
{
fout<<sol<<'\n';
int ind=0;
for(int i=1;i<=n;i++)
{
memset(snr,0,sizeof snr);
out=snr;
itos(Level[i],Level[i]==0);
*out++=' ';
itos(Cod[i],Cod[i]==0);
*out++='\n';
for(int j=0;snr[j];j++)
{
output[ind]=snr[j];
if(ind==SZ-1)
{
fout<<output;
ind=-1;
}
output[++ind]=0;
}
}
fout<<output;
}
int main()
{
fin>>n;
fin.read(buffer,SZ);
in=buffer;
for(int i=1;i<=n;i++)
{
F[i]=atoi();
Q1[i]=i;
}
F[0]=(1LL<<60);
nr=n;
for(int a,b;L1<=n || L2<Q2[0];)
{
a=pop();
b=pop();
F[++nr]=F[a]+F[b];
sol+=F[nr];
Son[nr][0]=a;
Son[nr][1]=b;
Q2[++Q2[0]]=nr;
}
DFS(nr,0,0);
print();
return 0;
}