Cod sursa(job #37949)

Utilizator anamaria1Ozorchevici Ana Maria anamaria1 Data 25 martie 2007 13:08:26
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<fstream.h>
#include<string.h>
#define dim 2002
struct cif
 {int nr;
  int ap[dim];
  int ok;
  int luate;
 };
cif v[10];
int l,lmax,lim;
char max;
char sir[2003],rez[dim],aux[dim];
void rec(int lp,int c)
{int x,y,i;
x=sir[c]-'0';
if((c<lim)&&(v[x].luate<v[x].nr))
 {if((v[x].nr>1)
     &&((v[x].ap[v[x].nr-1]-v[x].ap[v[x].luate+1])>=lmax)
     &&(v[x].ap[v[x].nr]<lim))
     {lp++;aux[lp]=sir[c];y=lim;lim=v[x].ap[v[x].nr];v[x].nr--;v[x].luate++;
      rec(lp,c+1);lim=y;v[x].nr++;v[x].luate--;lp--;rec(lp,c+1);
     }
    else if((v[x].nr>0)&&(v[x].ap[v[x].nr]<lim))
     {max=char('0'-1);
      if(lp>1)
       {y=aux[lp]-'0';
	for(i=v[y].ap[v[y].luate]+1;i<v[y].ap[v[y].nr];i++)
	 if(sir[i]>max) max=sir[i];
	lp++;aux[lp]=max;
       }
       else {lp++;aux[lp]=sir[c];}
      if(lp>lmax){for(i=0;i<=lp;i++)rez[i]=aux[i];lmax=lp;}
       else if(lp==lmax)
	     {for(i=0;i<=lp;i++)if(aux[i]<rez[i]) break;
	      if(i>lp) for(i=0;i<=lp;i++)rez[i]=aux[i];
	     }
     }
 }
 else if(lp>lmax) {for(i=0;i<=lp;i++)rez[i]=aux[i];lmax=lp;}
       else if(lp==lmax)
	     {for(i=0;i<=lp;i++)if(aux[i]<rez[i]) break;
	      if(i>lp) for(i=0;i<=lp;i++) rez[i]=aux[i];
	     }

}
int main()
{ifstream f("elimin2.in");
ofstream g("elimin2.out");
int i,x,j,y;
f.getline(sir,2003,'\n');f.close();
l=strlen(sir);
for(i=0;i<l;i++)
 {x=sir[i]-'0';
  if(!v[x].ok)
   {v[x].ok=1;v[x].nr=1;v[x].ap[v[x].nr]=i;
    for(j=i+1;j<l;j++)
     {y=sir[j]-'0';
      if(y==x) {v[x].nr++;v[x].ap[v[x].nr]=j;}
     }
   }
 }
lim=l;
for(i=0;i<l;i++) if(sir[i]!='0'){lim=l;rec(-1,i);}
if(lmax%2)
 {for(i=0;i<=lmax;i++) g<<rez[i];
  for(i=lmax-1;i>=0;i--) g<<rez[i];
 }
 else
  {for(i=0;i<=lmax;i++) g<<rez[i];
   for(i=lmax;i>=0;i--) g<<rez[i];
  }
g<<'\n';
g.close();
return 0;
}