Cod sursa(job #253756)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 6 februarie 2009 12:11:41
Problema Episoade Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 3.63 kb
#include <stdio.h>
#include <string.h>
#define MAX 2000

char a[MAX];
int n,t;
int mat[25][110];
int viz[1000];
int sir1[1000];
int viz1[1000];
int viz2[1000];
int sir2[1000];
int nr1,nr2;

void citire()
{
   freopen ("episoade.in","r",stdin);
   fgets(a,MAX,stdin);
   scanf ("%d %d",&t,&n);
   for (int i=0;i<t;i++)
     for (int j=0;j<n;j++)
          scanf ("%d ",&mat[i][j]);
}

long da(int st,int dr,char s1)
{
   int num=0;
   for (int i=dr;i>=st;i--)
   {
       if (a[i]==')')
      num++;
       else
     if (a[i]=='(')
	  num--;
     else
       if (a[i]==s1 && num==0)
	   return i;
   }

  return -1;
}

int paranteza(int &st,int &dr)
{
   int num=0;
   if (a[st]!='('&& a[dr]!=')')
      return 0;
   for (int i=dr-1;i>st;i--)
      if (a[i]==')')
     num++;
      else
    if (a[i]=='(')
    {
       num--;
       if (num<0)
	  return 0;
    }
   if (num==0)
   {
       st++;
       dr--;
       return 1;
   }
   return 0;
}

long lal (int n,int m)
{
    long aa=0;
    char pp[100];
	 for (int k=n;k<=m;k++)
	      pp[k-n]=a[k];
	      pp[m-n+1]=0;
    sscanf(pp,"%ld",&aa);
    return aa;
}


void calc(int st,int dr,int au)
{

     memset(viz1,0,sizeof(viz1));
     memset(viz2,0,sizeof(viz2));
     nr1=nr2=0;
     int aux=0;
     for (int i=st;i<au;i++)
     {
          while (a[i]>='0' && a[i]<='9')
          {
               aux=aux*10+a[i]-'0';
               i++;
          }
          if (a[i-1]>='0' && a[i-1]<='9')
          {
               sir1[nr1++]=aux;
               viz1[aux]=1;
               aux=0;
          }
     }


     for (int i=au+1;i<=dr;i++)
     {
          while (a[i]>='0' && a[i]<='9')
          {
               aux=aux*10+a[i]-'0';
               i++;
          }
          if (a[i-1]>='0' && a[i-1]<='9')
          {
               sir2[nr2++]=aux;
               viz2[aux]=1;
               aux=0;
          }
     }
}

int fct(int poz)
{
     int ok1=0,ok2=0,fost=0;
     for (int i=0;i<n;i++)
          if (viz1[mat[poz][i]]==1)
          {
               ok1++;
               if (fost==2 && ok1>1)
                    return 0;
               fost=1;
          }
          else
               if (viz2[mat[poz][i]]==1)
               {
                    ok2++;
                    if (fost==1 && ok2>1)
                         return 0;
                    fost=2;
               }
     return 1;
}

void unu(int st,int dr,int aux)
{
     for (int i=0;i<t;i++)
          if (viz[i])
               viz[i]=fct(i);
}

int fct2(int poz,int nr1)
{
     for (int i=0;i<n;i++)
          if (viz1[mat[poz][i]]==1)
               nr1--;
          else
               if (viz2[mat[poz][i]]==1)
               {
                    if (nr1==0 && viz1[mat[poz][i-1]]==1)
                         return 1;
                    return 0;
               }
     return 1;
}

void doi(int st,int dr,int aux)
{
     for (int i=0;i<t;i++)
          if (viz[i])
               viz[i]=fct2(i,nr1);
}

void lol(int st,int dr)
{
  while (paranteza(st,dr));
  long aux=da(st+1,dr,'#');
  if (aux==-1)
     aux=da(st+1,dr,'>');
   if (aux==-1)
       return ;
     calc(st,dr,aux);
  switch (a[aux])
   {
   case '#':  unu(st,dr,aux); break;
   case '>':  doi(st,dr,aux); break;;
   }
   lol(st,aux-1);
   lol(aux+1,dr);
}

int main ()
{
   citire();
   for (int i=0;i<100;i++)
     viz[i]=1;
   int n=(a[strlen (a)-1]=='\n')?strlen(a)-2:strlen(a)-1;
   freopen ("episoade.out","w",stdout);
   lol(0,n);
   for (int i=0;i<t;i++)
     printf("%d\n",viz[i]);
   return 0;
}