Cod sursa(job #530089)

Utilizator nautilusCohal Alexandru nautilus Data 6 februarie 2011 20:19:54
Problema Ordine Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
#define dmax 1000010
#define dmax2 30
using namespace std;

typedef struct litera
{
 char lit;
 int apar;
} litera;

litera l[dmax2];
int lg,k;
char sol[dmax];

void citire()
{
 char s[dmax];
 int i,j,ok;
	
 ifstream fin("ordine.in");
 
 fin.get(s,dmax);
 
 fin.close();
 
 
 lg = strlen(s);
 for (i=0; i<lg; i++)
	 {
	  ok=0;
	  
	  for (j=1; j<=k; j++)
		 if (l[j].lit == s[i])
			 {
			  l[j].apar++;
			  ok=1;
			 }
		 
	  if (ok == 0)
		 {
		  k++;
		  l[k].apar = 1;
		  l[k].lit = s[i];
		 }
	 }
}


bool comp(litera a, litera b)
{
 return a.lit < b.lit;
}


void solve()
{
 int i,j,ok;
	
 for (i=0; i<lg; i++)
	 {
	  ok=0;
	  
	  for (j=1; j<=k; j++) /*verific daca am vreo litera care trebuie pusa urgent*/
		  if (l[j].apar > ((lg - i) / 2))
			  {
			   sol[i] = l[j].lit;
			   l[j].apar--;
			   ok=1;
			   break;
			  }
	 
	  if (ok == 0)
		  for (j=1; j<=k; j++) /*caut prima litera care inca nu i-am epuizat toate aparitiile si care este diferita fata de precedenta*/
			  if (l[j].apar != 0 && l[j].lit != sol[i-1])
				  {
				   sol[i] = l[j].lit;
				   l[j].apar--;
				   break;
				  }
	 }
}


void afisare()
{
 ofstream fout("ordine.out");
 
 fout<<sol;
 
 fout.close();
}


int main()
{
	
 citire();
 sort(l+1, l+k+1, comp);
 solve();
 afisare();
	
 return 0;
}