Cod sursa(job #109931)

Utilizator savimSerban Andrei Stan savim Data 25 noiembrie 2007 12:57:35
Problema Ordine Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 5-8 Marime 1.39 kb
#include <stdio.h>
#include <string.h>
int sum,i,j,k,up,m,max,s;
char c[10001],f[10001];
int nr[27];
    
int main()
{
    
    freopen("ordine.in","r",stdin);
    freopen("ordine.out","w",stdout);

    scanf("%s",&c);
    for (i=0; i<=strlen(c); i++)
        nr[c[i]-96]++;    

    m=0;
	for (i=1; i<=10000; i++)
        f[i]=' ';
    for (i=1; i<=nr[1]; i++)
	{
		m++;
		f[m]='a';
	}
	sum=nr[1];

	up=0;
	for (i=1; i<=26; i++)
		if (nr[i]!=0) up=i;
	for (i=2; i<=26; i++)
	if (nr[i]!=0)
	{
		s=0;max=0;
		for (j=i; j<=26; j++)
			if (nr[j]>max)
			{
				max=nr[j];
				s=j;
			}
		for (j=i; j<=26; j++)
			if (j!=s) max=max-nr[j];
		if (sum>=max)
		{
		   for (j=1; j<=m-1; j++)
				if (f[j]==f[j+1])
				{
					s=j;
					break;
				}
		   int aa=m-s;
		   for (j=s+1; j<=m; j++)
		   {
			   f[j+aa]=f[j];
			   f[j]=' ';
			   aa--;
		   }
		   m+=nr[i];
		   for (j=1; j<=m; j++)
				if (f[j]==' ') f[j]=char(i+96);
		}
		else
		{
		   if (i!=up)
		   {
				for (j=m+1; j<=nr[i]+m; j++)
					f[j]=char(i+96);
				m+=nr[i];
		   }
		   else
		   {
				int aa=m+1;
				for (j=m; j>=1; j--)
				{
					aa--;
					f[j+aa]=f[j];
					f[j]=' ';
				}
				m+=m+1;
				for (j=1; j<=m; j++)
					if (f[j]==' ') f[j]=char(i+96);

		   }
		}
		sum+=nr[i];
	}
	for (i=1; i<=m; i++)
		printf("%c",f[i]);
	printf("\n");
    return 0;    
}