Cod sursa(job #253884)

Utilizator FlorianFlorian Marcu Florian Data 6 februarie 2009 13:18:58
Problema Episoade Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.82 kb
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
FILE*f=fopen("episoade.in","r");
FILE*g=fopen("episoade.out","w");
struct Graf
 {
  int vf;
  Graf *urm;
 };
Graf *G[102];
int NR; // numar componente conexe
int com[105]; // con[i] - componenta conexa a lui i
int n,t;
char s[1002];
int st[105], vf;
inline void insert(int a, int b)
 {
  Graf *q;
  q=new Graf;
  q->vf=b;
  q->urm=G[a];
  G[a] = q;
 }
inline int muchie(int x, int y)
 {
  Graf *q;
  for(q=G[x];q;q=q->urm)
   if(q->vf == y) return 1;
  return 0;
 }
void build()
 {
  int i,L=strlen(s);
  int nr=0;
  s[L]='#';
  for(i=0;i<=L;++i)
   {
    if(isdigit(s[i])) nr=nr*10+(s[i]-'0');
    else if(s[i]=='>')
      {
       st[++vf]=nr;
       nr=0;
      }
    else if(s[i]=='#')
      {
      st[++vf]=nr; nr=0;
       //scot din stiva. am muchia st[vf-1] -> st[vf]
       NR++; // o noua comp conexa.
       do
        {
         if(vf>1) insert(st[vf-1],st[vf]);
         com[st[vf]] = NR;
         vf--;
        }
       while(vf);

      }
    }
  }
int ok(int a[])
 {
  int i;
  int plat[105];
  plat[n] = com[a[n]];
  for(i=1;i<n;++i)
   {
    plat[i] = com[a[i]];
    if(com[a[i]] == com[a[i+1]])
      {
      if(!muchie(a[i], a[i+1])) return 0;
      }
    else
     {
      if(abs(com[a[i]] - com[a[i+1]])>1) return 0;
     }
   }
  int f[105];
  memset(f,0,sizeof(f));
  f[plat[1]]=1;
  for(i=2;i<=n;++i)
   {
    if(!f[plat[i]]) f[plat[i]]=1;
    else
     {
      if(plat[i] != plat[i-1]) return 0;
      }
   }
  return 1;
  }
int main()
 {
  fscanf(f,"%s\n",s);
  fscanf(f,"%d%d",&t,&n);
  int a[105],i;
  build();
  while(t--)
   {
    for(i=1;i<=n;++i) fscanf(f,"%d",&a[i]);
    if(ok(a)) fprintf(g,"1\n");
    else fprintf(g,"0\n");
   }
  return 0;
  }