Cod sursa(job #390160)

Utilizator vlad.maneaVlad Manea vlad.manea Data 3 februarie 2010 10:51:45
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
using namespace std;

int ma, cif[10][524288], *vec[2][10], A[524288];

int main()
{
	int cifra, N, i, j, k;

	ifstream fin("algsort.in");
	ofstream fout("algsort.out");

	fin >> N;
	for (i = 0; i < N; ++i)
		fin >> A[i];

	for (i = 0; i < N; ++i)
	{
		// aflu cifrele pe fiecare pozitie
		j = A[i];
		for (k = 0; j; j /= 10, ++k)
			cif[k][i] = j % 10;
		if (k > ma)
			ma = k;
	}

	// fac vector0
	for (i = 0; i < 10; ++i)
	{
		// aloc
		vec[0][i] = (int *)malloc(sizeof(int));

		// initializez
		vec[0][i][0] = 0;
	}

	// pun in lista dupa ultima cifra
	for (i = 0; i < N; ++i)
	{
		// aflu cifra
		cifra = cif[0][i];

		// adun la cifra
		++vec[0][cifra][0];

		// realoc
		vec[0][cifra] = (int *)realloc(vec[0][cifra], sizeof(int) * (vec[0][cifra][0] + 1));

		// calculez vectorul
		vec[0][cifra][vec[0][cifra][0]] = i;
	}

	// pentru fiecare cifra
	for (k = 1; k < ma; ++k)
	{
		// initializez vectorul in care voi pune numerele
		for (i = 0; i < 10; ++i)
		{
			// realoc
			vec[k & 1][i] = (int *)realloc(vec[k & 1][i], sizeof(int));

			// pun
			vec[k & 1][i][0] = 0;
		}

		// pentru fiecare cifra
		for (i = 0; i < 10; ++i)
		{
			// pentru fiecare element din lista
			for (j = 1; j <= vec[1 ^ (k & 1)][i][0]; ++j)
			{
				// aflu cifra
				cifra = cif[k][vec[1 ^ (k & 1)][i][j]];

				// pun
				++vec[k & 1][cifra][0];

				// realoc
				vec[k & 1][cifra] = (int *)realloc(vec[k & 1][cifra], (vec[k & 1][cifra][0] + 1) * sizeof(int));

				// calculez vectorul
				vec[k & 1][cifra][vec[k & 1][cifra][0]] = vec[1 ^ (k & 1)][i][j];
			}
		}
	}

	// pentru fiecare cifra
	for (i = 0, k--; i < 10; ++i)
	{
		// pentru fiecare element din lista
		for (j = 1; j <= vec[k & 1][i][0]; ++j)
		{
			// scriu numarul
			fout << A[vec[k & 1][i][j]] << ' ';
		}
	}

	for (i = 0; i < 10; ++i)
	{
		free(vec[0][i]);
		free(vec[1][i]);
	}

	fin.close();
	fout.close();

	return 0;
}