Cod sursa(job #305220)

Utilizator LuffyBanu Lavinia Luffy Data 16 aprilie 2009 18:06:06
Problema Ordine Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>   
#include<string>         
#define dim 1000000         
#define dimm 123         
using namespace std;         
char b[dim],a,xx,v[dim];         
short int nr[dimm];         
int main()         
{int i=0,n,j,m=0,x=0,p=0;         
 FILE *f=fopen("ordine.in","r"), *g=fopen("ordine.out","w");    
  
          
  while(!feof(f))      
  {fscanf(f,"%c",&a);   
      i++;         
   nr[int(a)]++;} n=i;           
        
  for(i=97;i<=122;i++)         
  {pas1:         
   if(nr[i]==1) {b[m]=(char)i; m++; nr[i]--;}         
   if(nr[i]>1)          
   {b[m]=(char)i; m++; nr[i]--;         
     for(j=i+1;j<=122;j++)         
      pas2:if(nr[j]>0) {pas3: b[m]=(char)j; m++; b[m]=(char)i; m++; nr[i]--; nr[j]--;         
                   if(nr[i]==0) goto pas1;         
                   if(nr[j]==0) goto pas2;         
                   else goto pas3;}         
   }}      
 for(i=122;i>=97;i--)      
 if(nr[i]>0) {x=nr[i]; nr[i]=0; xx=(char)i; break;}        
 
 for(i=m;i>=1;i--)      
  if(b[i]==xx) {p=i; if(b[i]<xx) break;}      
 p=p-x;n=0;       
 
  for(i=0;i<=m-1;i++)      
{if((i>=p)&&(x>0))    
{v[n]=xx; n++; v[n]=b[i]; n++; x--;   
}      
 else {v[n]=b[i]; n++;}   
 }   
  
for(i=n/2;i<=n-2;i++)   
 for(j=i+1;j<=n-1;j++)   
    if(v[j]<v[i]&&v[j+1]!=v[i]&&v[i-1]!=v[j]) {a=v[i];   
                   v[i]=v[j];   
                   v[j]=a; break;}     
  
       
 v[n]='\0';   
    fprintf(g,"%s\n",v);   
  
  
fclose(f);         
fclose(g);         
return 0;         
        
}