Cod sursa(job #110211)

Utilizator t_ralucaTrofin Raluca t_raluca Data 25 noiembrie 2007 20:53:08
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>


char s[26] , ch, final[16000];
long int nrs[4000], i, l, p, j, pfinal;
FILE *f;


void citire(){
p=-1; l=0;
f=fopen("ordine.in", "r");

while(!feof(f)){
   fscanf(f, "%c", &ch);
   if(feof(f)!=0){break;}
   l++;
   if(p==-1){p++; s[p]=ch;nrs[p]=1;}
   else if (s[p]==ch){nrs[p]++;}
   else if(s[p]>ch){
       // gasesc pozitia in tabloul s unde trebuie inserat ch
       i=p;
       while(s[i]>ch && i>=0) {i--;}
       if(s[i]==ch &&i>=0){nrs[i]++;}
       else{
	  p++;
	  for(j=p; j>i+1; j--){
	     s[j]= s[j-1];
	     nrs[j]= nrs[j-1];
	  }

	 s[i+1]=ch;
	 nrs[i+1]=1;
       }
   }
   else if (s[p]<ch && p>=0){ p++; s[p]=ch; nrs[p]=1;}

}
fclose(f);
}


void afisare(){
int gata; char cprec;
gata=0;
pfinal=0;
f=fopen("ordine.out", "w");

final[0]=s[0];
cprec=s[0]; nrs[0]--;

while(gata==0){
 i=0;
 while ((i<=p) && (s[i]==cprec || nrs[i]==0) ){
   i++;
 }

 if(i<=p){
   pfinal++;
   final[pfinal]=s[i];
   nrs[i]--;
   cprec=s[i];
 }
 if(i>p){gata=1;}
}

if(pfinal<l){
   // aflu ce caracter a ramas neadaugat
   char c;
   i=p;
   while(i>=0 && nrs[i]==0){i--;}
   //caracterul s[i] va trebui inserat

   while(nrs[i]!=0){
      j=pfinal;
      while(j>=0 && final[j]==s[i]){j=j-2;}
      // inseram caracterul s[i] pe poz j
      pfinal++;
      long int k;
      for(k=pfinal; k>=j+2; k--){
	 final[k]=final[k-1];
      }
      final[j+1]=s[i];
      nrs[i]--;
   }

}


 for(i=0; i<=pfinal; i++){
    fprintf(f, "%c", final[i]);
 }
 fclose(f);
}

int main(){
citire();
afisare();
return 0;
}