Pagini recente » Cod sursa (job #1024817) | Cod sursa (job #704025) | Cod sursa (job #1925588) | Cod sursa (job #691954) | Cod sursa (job #743387)
Cod sursa(job #743387)
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
#define U long long
#define NM 2000000
U frecventa[NM],reprezentare[NM],lung = 0;
int dep[NM],leftSon[NM],rightSon[NM],N,nInit;
queue <int> q1,q2;
inline void readInputData()
{
scanf("%d",&nInit);
N = nInit;
U aux;
for (U i=1; i<=nInit; ++i)
{
scanf("%lld,",&frecventa[i]);
//ind[i]=i;
q1.push(i);
}
fclose(stdin);
}
inline void update( int &p1, int &p2)
{
++N;
frecventa[N] = frecventa[ p1 ] + frecventa[ p2 ];
leftSon[N] = p1;
rightSon[N] = p2;
//ind[N]=N;
if (q1.empty() && q2.empty() )
return;
q2.push(N);
}
inline void verific(queue<int> &q, int &poz1,int &poz2)
{
poz1=q.front();
q.pop();
poz2=q.front();
q.pop();
update(poz1,poz2);
}
inline void capete ( int &p)
{
if (frecventa[q1.front()] <= frecventa[ q2.front()])
{
p = q1.front();
q1.pop();
return;
}
p = q2.front();
q2.pop();
}
inline void solveHuffman()
{
int poz1,poz2;
while ( !q1.empty () || !q2.empty() )
{
if (q1.empty())
{
verific(q2,poz1,poz2);
continue;
}
if (q2.empty())
{
verific(q1,poz1,poz2);
continue;
}
capete(poz1);
if (q1.empty())
{
poz2 = q2.front();
q2.pop();
update(poz1,poz2);
continue;
}
if (q2.empty())
{
poz2 = q1.front();
q1.pop();
update(poz1,poz2);
continue;
}
capete(poz2);
update(poz1,poz2);
}
}
void df(int nod, U cod,int nivel)
{
if (nod !=N )
lung += frecventa[nod];
//funza
if (nod <= nInit)
{
dep[nod] = nivel;
reprezentare[nod] = cod;
return;
}
df(leftSon[nod],(cod<<1) +1,nivel+1);
df(rightSon[nod],(cod<<1) ,nivel+1);
}
inline void afis()
{
freopen ("huffman.out","w",stdout);
printf("%lld\n",lung);
for (int i=1; i<=nInit; ++i)
printf("%d\n%lld\n",dep[i],reprezentare[i]);
fclose(stdout);
}
int main()
{
freopen ("huffman.in","r",stdin);
readInputData();
solveHuffman();
df(N,0,0);
afis();
return 0;
}