Cod sursa(job #111913)

Utilizator frEak-Calin Paul frEak- Data 2 decembrie 2007 14:29:53
Problema Ordine Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<stdio.h>
#include<string.h>

int h[26],l=-1,p,g; //histrograma, lungime, pimu
char ch,x[1000*1000+2];

void citire()
{
	for (int i=0;i<26;i++) h[i]=0;
	freopen("ordine.in","r",stdin);
	while (scanf("%c",&ch)==1) h[ch-97]++;
	fclose(stdin);
	for (int i=0;i<26;i++)
	{
		for (int j=0;j<h[i];j++)
		{
			l++;
			x[l]=97+i;
			x[l+1]='\0';
		};
	};
};
void interschimba(char &e,char &f)
{
	char aux;
	aux=e;e=f;f=aux;
}
void ordin(int &i)
{
	p=1;
	if (x[i]==x[i+1])
	{
		p++;
		while (x[i]==x[i+p]) p++;
		if (l+1-i-p>=p-1)
		{
			for (int j=1;j<p;j+=1) interschimba(x[i-1+j*2],x[i+p-1+j]);
			i=i+2*p-1;
		}
		else 
		{
			for (int k=0;k<p;k++)
				interschimba(x[i+k],x[l-k]);
			for (int j=1;j<p;j+=1) interschimba(x[l+1-j*2],x[l-p+1-j]);
			i=l;
		}
	}
};
int main()
{
	citire();
	g=0;
	while (g<l)
	{
		ordin(g);
		g++;
	}
	freopen("ordine.out","w",stdout);
	puts(x);
	fclose(stdout);
	return 0;
}