Cod sursa(job #112436)

Utilizator kojocojocaru aurelian kojo Data 5 decembrie 2007 14:39:59
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<fstream.h>
#include<string.h>
ifstream f("ordine.in");
ofstream g("ordine.out");
char a[100000],d[100000],b[26];
int k,j,ga;
void bordare()
{int q=0;
for(char i='a';i<='z';i++)
  b[q++]=i;
}
int cauta(int x,int c[26], int &j)
{
for(int i=x;i<=k;i++)
	c[a[i]-'a']++;
int max=c[0];j=0;
for(i=1;i<=25;i++)
	if(c[i]>max)
	{max=c[i];j=i;}
	return max;
}
void sortare()
{int t=strlen(d)-1,ga=0,z=t-1;
 while(!ga)
	{ga=1;
	 for(int l=1;l<=z;l++)
		 if(d[l]>d[l+1])
		 {char v=d[l];d[l]=d[l+1];d[l+1]=v;ga=0;}
      z--;
	 }
}
void inser(int x,int j)
{int q=0;
for(int i=x;i<=k;i++)
	if(a[i]!=b[j])
		d[q++]=a[i];
for(int s=x;s<=k;s+=2)
	a[s]=b[j];
sortare();
q=0;
for(s=x+1;s<=k;s+=2)
 a[s]=d[q++];
}
char minim(int x,int &j,char p)
{int min='z'+'1';
for(int y=x;y<=k;y++)
	if(a[y]!=p&&a[y]<min)
		{min=a[y];j=y;}
return min;
}
int c[26];
int main()
{
f>>a;
bordare();
k=strlen(a)-1;
if(cauta(0,c,j)==(k+1)/2+1)
	{inser(0,j);ga=1;}
else
	{char u=a[0];
	 a[0]=minim(0,j,'A');
	 a[j]=u;	
	}
for(int i=1;i<=k&&!ga;i++)
	if(cauta(i,c,j)==(k-i+1)/2+1)//cauta() vede daca un caracter apare de jumatate+1 ori
	   {inser(i,j);ga=1;}
	else
		{char u=a[i];
		 a[i]=minim(i,j,a[i-1]);
		 a[j]=u;	
		}
g<<a;
return 0;
}