Cod sursa(job #128211)

Utilizator Omega91Nicodei Eduard Omega91 Data 26 ianuarie 2008 17:35:26
Problema Ordine Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
//#include <iostream>
#include <fstream>
using namespace std;
int main()
{
	ifstream f1("ordine.in");
	ofstream f2("ordine.out");
	long k = 0, i, j, min = 0, aux;
	char c, vecbun[1000001] = {};
	unsigned long s[29] = {};
	c = f1.get();
	while (c != '\n') {
		++s[c - 97];
		c = f1.get();
	}
	for (j = 0; j < 26; ) {
		if (s[j]) {
			vecbun[k] = j + 97;
			--s[j];
			k += 2;
		}
		else {
			++j;
			for (i = min; ; ++i)
				if ( !vecbun[i] ) {
					min = i;
					k = i;
					break;
				}
		}
	}
	k = 0;
	for (i = min + 1; ; i += 2)
		if (vecbun[i]) ++k;
		else {
			c = vecbun[i - 2];
			break;
		}
	j = 0;
	if (k) {
		for (i = min - 1; i >= 0; i -= 2)
			if (vecbun[i] != c) {
				j = i + 1;
				break;
			}
		if (j == 0) f2 << c << vecbun << endl;
		else {
			for (i = 0; i <= j - k; ++i) f2 << vecbun[i];
			//sort j-k+1 -> j
			aux = j - k + 1;
			for (i = aux; i <= j; ++i) ++s[vecbun[i] - 97];
			for (i = 0; i < 26; )
				if (s[i]) {
					f2 << c << (char)(i + 97);
					--s[i];
				}
				else ++i;
			
			
			//for (; i <= j; ++i)
			//	f2 << c << vecbun[++j];
			for (i = j + 1; i < min; ++i)
				f2 << vecbun[i];
			f2 << endl;
		}
	}
	else f2 << vecbun << endl;
	f1.close();
	f2.close();
	//cout << vecbun << endl;
	return 0;
}