Cod sursa(job #514779)

Utilizator radubbRadu B radubb Data 19 decembrie 2010 16:17:36
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <algorithm>
using namespace std;

#define nmax 1000001
char sir[nmax];
int anag[nmax],pozitie[nmax];
long n,q;
int lit[27];
int poz;

inline void citire()
{
	ifstream in("ordine.in");
	in>>sir; n=strlen(sir)-1;
}

inline void afisare()
{
	ofstream out("ordine.out");
	long i;
	for(i=1;i<=n+1;i++)
	{
		if(pozitie[i])
			out<<char(poz+'a'-1);
		out<<char(anag[i]+'a'-1);
	}
	exit(0);
}

inline int solo()
{
	int i,k=0;
	for(i=1;i<=26;i++)
		if(lit[i]) 
		{
			k++;
			poz=i;
		}
	if(k==1)
		return poz;
	return 0;
}

void rez()
{
	long i,j;
	for(i=0;i<=n;i++)
		lit[int(sir[i])-'a'+1]++;

	for(i=1;i<=26;i++)
	{
		poz = solo();
		if(poz)
		{
			n -= lit[poz]-1;
			if(anag[q]!=poz)
			{
				anag[++q]=poz;
				lit[poz]--;
			}
			for(j=q;j>0;j--)
				if(anag[j]!=poz && anag[j-1]!=poz && lit[poz])
				{
					pozitie[j]=1;
					lit[poz]--;
				}
			afisare();
		}
		else
		while(lit[i])
		{
			if(i!=anag[q])
			{
				anag[++q]=i;
				lit[i]--;
				for(j=i+1;j<=26;j++)
					if(lit[j])
					{
						anag[++q]=j;
						lit[j]--;
						break;
					}
			}
			else
				for(j=i+1;j<=26;j++)
					if(lit[j])
					{
						anag[++q]=j;
						lit[j]--;
						break;
					}
		}
	}
	
}

int main()
{
	citire();
	rez();
	afisare();
	return 0;
}