Pagini recente » Cod sursa (job #2157118) | Cod sursa (job #430293) | Cod sursa (job #2698470) | Cod sursa (job #2308815) | Cod sursa (job #2077613)
#include <fstream>
#include <climits>
using namespace std;
const long numarMaximSimboluri = 1000001;
struct Nod
{
long long numarAparitii;
long fiu[2];
} nod[2 * numarMaximSimboluri];
long numarSimboluri, inceput[2], sfarsit[2];
long coada[2][numarMaximSimboluri], lungimeCod[numarMaximSimboluri];
long long reprezentareZecimalaCod[numarMaximSimboluri], lungimeMinimaText;
void parcurgereInAdancime(long i, long long cod, long adancime)
{
if(nod[i].fiu[0] != 0)
{
parcurgereInAdancime(nod[i].fiu[0], cod*2, adancime+1);
parcurgereInAdancime(nod[i].fiu[1], cod*2+1, adancime+1);
return;
}
lungimeCod[i] = adancime;
reprezentareZecimalaCod[i] = cod;
}
const long long infinit = LONG_LONG_MAX;
long numarNoduri;
void construiesteNoduriInterne()
{
inceput[0]=inceput[1]=1;
sfarsit[0]=numarSimboluri;
while(inceput[0]+inceput[1]<=sfarsit[0]+sfarsit[1])
{
for(int j=0; j<2; j++)
{
int coadaCuNodMinim=0;
long long numarMinimAparitii = infinit;
for(int i=0; i<2; i++)
{
if(nod[coada[i][inceput[i]]].numarAparitii < numarMinimAparitii && inceput[i]<=sfarsit[i])
{
coadaCuNodMinim = i;
numarMinimAparitii = nod[coada[i][inceput[i]]].numarAparitii;
}
}
nod[numarNoduri].fiu[j]=coada[coadaCuNodMinim][inceput[coadaCuNodMinim]];
nod[numarNoduri].numarAparitii+=nod[coada[coadaCuNodMinim][inceput[coadaCuNodMinim]]].numarAparitii;
inceput[coadaCuNodMinim]++;
}
lungimeMinimaText+=nod[numarNoduri].numarAparitii;
coada[1][++sfarsit[1]]=numarNoduri++;
}
}
int main()
{
ifstream fin("huffman.in");
fin>>numarSimboluri;
for(int i=1; i<=numarSimboluri; i++)
{
fin >> nod[i].numarAparitii;
coada[0][i]=i;
}
numarNoduri = numarSimboluri+1;
construiesteNoduriInterne();
parcurgereInAdancime(numarNoduri-1, 0, 0);
ofstream fout("huffman.out");
fout << lungimeMinimaText << '\n';
for(int i=1; i<=numarSimboluri; i++)
fout << lungimeCod[i] << ' ' << reprezentareZecimalaCod[i] << '\n';
return 0;
}