Cod sursa(job #37758)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 25 martie 2007 12:26:14
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 4, Clasa a 10-a Marime 1.83 kb
/* Ivan Nicolae - Bucuresti */
#include <stdio.h>
#include <string.h>

#define NMAX 2001
#define INFINITY 0x3f3f3f3f

int i,j,n,m,IN,SF,ala;
char A[NMAX+2];

int getLeft(char pat)
{
 int i,ala,pzo=-INFINITY;
 
 if (n % 2 == 0)
   ala=(n/2);
   else ala=(n/2)+1;
   
 for (i=ala;i<=n;i++)
    if (A[i]==pat)
      {
       pzo=i;
       break;
      }
      
 return (n-pzo+1);
}

int getRight(char pat)
{
 int i,ala,pzo=INFINITY;
 
 if (n % 2 == 0)
   ala=(n/2);
   else ala=(n/2);

 for (i=1;i<=ala;i++)
    if (A[i] == pat)
      {
       pzo=i;
       break;
      }

 return pzo+1;
}

void Elimina(int poz)
{
 int i;
 for (i=poz;i<=n;i++)
    A[i]=A[i+1];
 n--;
}

int main()
{
 freopen("elimin2.in","r",stdin);
 freopen("elimin2.out","w",stdout);

 gets(A);
 n = strlen(A); n--;

 IN=0; SF=n;
 while (IN < SF)
      {
       if (A[IN] == A[SF])
         { IN++; SF--; }
         else {
               int p1=getRight(A[SF]);
               int p2=getLeft(A[IN]);
               if (p1 < p2)
                 {
                  Elimina(IN);
                  ala=IN;
                 }
                 else if (p2 > p1)
                        {
                         Elimina(SF);
                         ala=SF;
                        }
                 else if (A[IN]<A[SF])
                        {
                         Elimina(SF);
                         ala=SF;
                        }
                 else {
                       Elimina(IN);
                       ala=IN;
                      }
                      
               if (IN > ala)
                 IN--;
               if (SF >= ala)
                 SF--;
              }
      }

 for (i=0;i<=n;i++)
    printf("%c",A[i]);

 fclose(stdin);
 fclose(stdout);
 return 0;
}