Cod sursa(job #37830)

Utilizator portocalaDiculescu Elena Alexandra portocala Data 25 martie 2007 12:46:14
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 4, Clasa a 10-a Marime 1.79 kb
#include <fstream.h>
#include <string.h>
char s[2003],w[1002],v[1002],max;
int l,k,lmax,x,ok;
void pal(int i,int j,int k)
{while(i<j){if(!k)while(!s[i]) i++;
	    if(s[i]==s[j]){w[k]=s[i];pal(i+1,j-1,k+1);}
	      else {max=-1;ok=0;
		    for(int q=i;q<=j;q++)if(s[q]>max){max=s[q];ok=1;}
		    int x=2*k+ok;
		    if(x>lmax)
		     {lmax=x;
		      for(q=0;q<k;q++)
		       v[q]=v[lmax-q-1]=w[q];
		      if(ok)v[q]=max;}
		     else if(x==lmax){q=0;
				  while((w[q]<=v[q])&&(q<k))
				   q++;
				  if(q==k){if((ok)&&(max>v[k]))for(q=0;q<k;q++)v[q]=v[lmax-q]=w[q];v[q]=max;}
				   else {for(q=0;q<k;q++)v[q]=v[lmax-q]=w[q];if(ok)v[q]=max;}
				 }
		    pal(i,j-1,k);
		   }
	    i++;
	   }
max=-1;ok=0;
for(int q=i;q<=j;q++)if(s[q]>max){max=s[q];ok=1;}
int x=2*k+ok;
if(x>lmax)
{lmax=x;
 for(q=0;q<k;q++)
  v[q]=v[lmax-q-1]=w[q];
 if(ok)v[q]=max;}
  else if(x==lmax){q=0;
		 while((w[q]<=v[q])&&(q<k))
		  q++;
		if(q==k){if((ok)&&(max>v[k]))for(q=0;q<k;q++)v[q]=v[lmax-q]=w[q];v[q]=max;}
			  else {for(q=0;q<k;q++)v[q]=v[lmax-q]=w[q];if(ok)v[q]=max;}
			}
}
int main()
{ifstream f("elimin2.in");
f.getline(s,2002,'\n');
f.close();
l=strlen(s);
x=l/2;
ok=0;
for(k=0;k<x;k++)
 {if(s[k]==s[l-k-1])v[k]=v[l-k-1]=s[k];
   else {ok=1;break;}
 }
if(ok)pal(0,l-1,0);
 else {if(l%2)v[x]=s[x];lmax=l;}
/*int i,j,n=l-1,q,ii=0,jj;ok=1;
while(ok)
{jj=n;k=0;
for(i=ii;i<jj;i++)
 {j=jj;
  while(i<j)
   {if(s[i]==s[j]){w[k]=s[i];jj=j-1;k++;break;}j--;}
 }
max=-1;
for(q=i+1;q<j;q++)if(s[q]>max)max=s[q];
if(max>-1){if((2*k+1)>lmax){lmax=2*k+1;for(q=0;q<k;q++)v[q]=w[q];v[q]=max;}}
 else {if((2*k+1)>lmax){lmax=2*k+1;for(q=0;q<k;q++)v[q]=w[q];}}
ii++;while(!s[ii])ii++;
if((l-ii)<lmax)ok=0;
}*/
v[lmax]='\n';
ofstream g("elimin2.out");
g<<v<<'\n';
g.close();
return 0;
}