Cod sursa(job #109605)

Utilizator ilincaSorescu Ilinca ilinca Data 25 noiembrie 2007 12:03:41
Problema Ordine Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 5-8 Marime 1.13 kb
#include <stdio.h>
#include <string.h>

 char x [1000001];
 long n, f [30];

 void frecventa ()
	       {
		   long i;
		   for (i=0;i<n;i++)
			f [x [i]-'a']++;
	       }

 void ordine ()
	    {
		char y [1000001];
		int i, j, ok=1;
		long p1, p=-1;
		y[0]=0;
		while (n > 0 && ok)
		     {
			 i=-1;
			 while ((f [++i] == 0 || i+'a' == y [p]) && i <= 'z'-'a'+1);
			 if (i+'a' <= 'z')
			  {
			      n--;
			      f [i]--;
			      y [++p]=i+'a';
			  } else ok=0;
		     }
		if (ok == 0)
		  {
		      for (i=0; i<=26; i++)
			   for (j=1; j<=f [i]; j++)
				y [++p]=i+'a';
		      y [++p]=0;
		      p1=p-1;
		      while (y [p-1] == y [p-2])
			   {
				//p1=p-1;
				while (y [--p1] == y [p-1]);
                                p1--;
				for (i=p; i>=p1; i--)
				     y [i+1]=y [i];
				y [p1+1]=y [p];
			   }
		      y [p]=0;
		  }
		y [++p]=0;
		printf ("%s", y);
	    }

 int main ()
	 {
	     freopen ("ordine.in", "r", stdin);
	     freopen ("ordine.out", "w", stdout);
	     gets (x);
	     n=strlen (x);
	     frecventa ();
	     ordine ();
	     fcloseall ();
	     return 0;
	 }