Cod sursa(job #533261)

Utilizator feelshiftFeelshift feelshift Data 13 februarie 2011 16:23:25
Problema Ordine Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
// http://infoarena.ro/problema/ordine
#include <fstream>
#include <string>
using namespace std;

ifstream in("ordine.in");
ofstream out("ordine.out");

string word;
int letter[200];
int i,lenght;
char currentLetter,previous,following;

int main() {
	in >> word;
	lenght = word.size() - 1;

	// retinem numarul de aparitii al fiecarei
	// litera in cadrul sirului
	for (i=0;i<=lenght;i++)
		letter[word[i]]++; 
	previous = ' ';

	// parcurgem fiecare litera a sirului
	for (i=0;i<=lenght;i++) {
		// presupunem ca litera care urmeaza este z
		// (cea mai mare din punct de vedere lexicografic
		following = 'z';

		// parcurgem fiecare litera a alfabetului
		for (currentLetter='a';currentLetter<='z';currentLetter++)
			// daca o litera are numarul de aparitii (lenght-i+1)/2+1
			// ea trebuie neaparat sa fie pe urmatoarea pozitie
			// (in caz contrar sirul nu poate fi construit, fiind
			// nevoiti sa o asezam pe pozitii consecutive)
			if (letter[currentLetter] == (lenght-i+1)/2+1) {
				following = currentLetter;
				break;
			}
			else
				// following va retine prima litera, insa nu iesim
				// cu break pentru ca am putea intalni o litera
				// care sa corespunda if-ului anterior
				if (letter[currentLetter] && currentLetter != previous && currentLetter < following)
					following = currentLetter;

		out << following;
		letter[following]--;
		previous = following;
	}

	return 0;
}