Cod sursa(job #160566)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 16 martie 2008 10:56:57
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <string.h>
#define J 50
#define N 100000
char v[N];
int f[N];
struct solutie{
	int aa,bb;
};	
int main()
{
	solutie sol[N];
	int min,l,i,j,g,nr=0;
	int inj,gata,aux,aux1;
	freopen("ordine.in", "r",stdin);
	freopen("ordine.out", "w",stdout);
	scanf("%s\n", v);
	l=strlen(v);
	for(i=0;i<l;++i)
	{
		if(!f[v[i]]) ++nr;
		++f[v[i]];
	}
		
	inj=l;
	while(inj>1)
	{
		inj/=2;
		do{
			gata=1;
				for(i=0;i<l-inj;++i)
					if (v[i]>v[i+inj])
					{
						gata=0;
						aux=v[i];
						aux1=f[i];
						v[i]=v[i+inj];
						f[i]=f[i+inj];
						v[i+inj]=aux;
						f[i+inj]=aux1;
					}
		}while(!gata);
	}
	
	sol[0].aa=v[0];
	sol[0].bb=f[0];
	v[0]=0;
	
	for(i=1;i<l;++i)
	{
		g=0;
		for(j=0;j<l;++j)
		{
			if(sol[i-1].aa!=v[j] &&  v[j]!=0 && !g)
			{ min=j; g=1; }
			if(sol[i-1].aa!=v[j] && f[i]==(l-i+1/2)+1)
			{
				sol[i].aa=v[j];
				sol[i].bb=f[j];
				v[j]=0;
				g=3;
				break;
			}
		}
		if(g!=3)
		{
			sol[i].aa=v[min];
			sol[i].bb=f[min];
			v[min]=0;
		}	
	}	
	//N-x+1)/2+1		
			
	for(i=0;i<l;++i)
		printf("%c", sol[i].aa,sol[i].bb);
	
	
	return 0;
}