Cod sursa(job #111915)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 2 decembrie 2007 14:41:15
Problema Ordine Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 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]; M[rez[0]]--;
 for (i=1;i<=n;i++)
    {
     int gasit=0;
     for (j=0;j<=A-1;j++)
        if (M[alfa[j]] == (n-i+1)/2+1)
          { rez[i]=alfa[j]; M[alfa[j]]--; gasit=1; break; }
     if (!gasit)
     for (j=0;j<=A-1;j++)
        if (M[alfa[j]]>0 && alfa[j]!=rez[i-1])
          { rez[i]=alfa[j]; M[alfa[j]]--; break; }
    }

 puts(rez);

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