Cod sursa(job #305133)

Utilizator LuffyBanu Lavinia Luffy Data 16 aprilie 2009 13:10:51
Problema Ordine Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<fstream>
#include<string>      
#define dim 1000000      
#define dimm 123      
using namespace std;      
char b[dim],a,xx,v[dim];      
int nr[dimm];      
int main()      
{int i=0,n,j,m=0,x=0,p=0;      
 ifstream f("ordine.in");      
 ofstream g("ordine.out");      
       
  while(f>>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=0;i<=m;i++)   
  if(b[i]==xx) {p=i; 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=0;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;}	

	
 g<<v;

g<<'\n';
f.close();      
g.close();      
return 0;      
     
}