Cod sursa(job #516786)

Utilizator radubbRadu B radubb Data 26 decembrie 2010 14:02:19
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>
using namespace std;

#define nmax 1000003

long lit[28],n,q;
int sol[nmax];
bool poz[nmax];

ofstream out("ordine.out");
inline void citire()
{
	char sir[nmax];
	ifstream in("ordine.in"); in>>sir; n=strlen(sir);
	for(long i=0;i<n;i++)
		lit[int(sir[i])-'a'+1]++;
}

void solve()
{
	int i,j;
	bool ok;

	for(i=1;i<=27;i++)
	{
		while(lit[i])
		{
			if(i != sol[q])
			{ sol[++q]=i; n--; ok = true; lit[i]--; }
			else
			{
				ok = false;
				for(j=1;j<=27;j++)
					if(lit[j] && sol[q]!=j)
					{
						ok = true; n--; lit[j]--;
						sol[++q]=j;
						break;
					}
			}
			if(!ok)
				break;
		}
	}

	int last;
	if(n)
	{
		
		for(i=1;i<=27;i++)
			if(lit[i])
			{
				last=i;
				break;
			}
		for(i=q;i>=0;i--)
			if(sol[i]!=last && sol[i+1]!=last)
			{
				poz[i]=1;
				n--;
				if(n==0)
					break;
			}
	}
	out<<n<<" "<<endl;
	if(poz[0])
		out<<char(last+'a'-1);
	for(i=1;i<=q;i++)
	{
		out<<char(sol[i]+'a'-1);
		if(poz[i])
			out<<char(last+'a'-1);
	}

		
}

int main()
{
	citire();
	solve();
	return 0;
}