Cod sursa(job #111663)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 1 decembrie 2007 17:27:42
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
/* Ivan Nicolae - Bucuresti */
/* Infoarena - Ordine */
#include <stdio.h>
#include <string.h>

#define NMAX 1000001
#define AMAX 30
#define ASCIIMAX 255
#define _fin  "ordine.in"
#define _fout "ordine.out"

int i,n,m,j,A,M[ASCIIMAX];
char text[NMAX],rez[NMAX],alfa[AMAX];

void Quick(int li, int ls)
{
 int i=li,j=ls;
 char x=text[(li+ls)>>1], y;
 while (i<=j)
      {
       while (text[i]<x) i++;
       while (text[j]>x) j--;
       if (i<=j)
         {
          y=text[i]; text[i]=text[j]; text[j]=y;
          i++; j--;
         }
      }
 if (i<ls) Quick(i,ls);
 if (li<j) Quick(li,j);
}

int main()
{
 freopen(_fin,"r",stdin);
 freopen(_fout,"w",stdout);

 gets(text);
 n=strlen(text)-1;
 Quick(0,n);
 alfa[A++]=text[0];
 for (i=1;i<=n;i++)
    if (text[i] != text[i-1])
      alfa[A++]=text[i];
 for (i=0;i<=n;i++)
    M[text[i]]++;

 rez[0]=alfa[0];
 for (i=1;i<=n;i++)
    for (j=0;j<=A;j++)
       if (M[alfa[j]]>0 && alfa[j]!=rez[i-1])
         { rez[i]=alfa[j]; M[alfa[j]]--; break; }

 printf("%s\n",rez);

 fclose(stdin);
 fclose(stdout);
 return 0;
}