Cod sursa(job #253729)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 6 februarie 2009 11:55:22
Problema Episoade Scor 50
Compilator c Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.8 kb
#include<stdio.h>
#define infile "episoade.in"
#define outfile "episoade.out"
#define nmax 101
#define lmax 1001
int p[nmax]; //vectorul de prioritati
char v[lmax]; //vectorul in care citim sirul
int x[nmax]; //vectorul in care citim pt fiecare test in ce ordine vrea sa citeasca
int t,n; //numarul de teste, respectiv numarul de episoade

//preprocesam matricea de prioritati
void preprocesare(int p[nmax], char v[lmax], int n)
	{
	int nr=0,nra=0; //aici refacem numerele, si in nra vom salva numarul anterior
	char semn=0; //aici vom avea # sau < sau va ramane 0 daca inca nu avem nicio prioritate
	int i=0;
	while(v[i]!='\n' && v[i]) //cat timp n-am preprocesat tot
		{
		if(v[i]>='0'&&v[i]<='9') //avem un episod
			{
			nra=nr; //salvam numarul care il avem deja
			nr=0; //initializam numarul
			while(v[i]>='0'&&v[i]<='9') //cat timp numarul are cifre
				nr=nr*10+v[i++]-'0'; //adaugam cifra la sfarsitul numarului
			if(semn=='>') p[nr]=nra; //episodul nr trebuie vazut imediat dupa episodul nra
			}
		if(v[i]=='#'||v[i]=='>')  semn=v[i++]; //citim semnul
		if(v[i]=='('||v[i]==')') i++; //noi nu verificam si pt siruri cu paranteze :((((
		}
	}

int verifica(int p[nmax], int x[nmax], int n)
	{
	int i;
	for(i=1;i<=n;i++)
		if(p[x[i]]) //inseamna ca x[i] are o prioritate
			if(x[i-1]!=p[x[i]]) return 0; //nu se respecta prioritatea...deci sir incorect
	return 1; //inseamna ca avem un sir corect
	}

int main()
{
int i;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

fgets(v,lmax,stdin); //citim sirul
scanf("%d %d\n",&t,&n);
preprocesare(p,v,n); //preprocesam
while(t--) //avem de verificat siruri
	{
	for(i=1;i<=n;i++) scanf("%d",&x[i]); //citim ordinea in care vrea sa citeasca baiatu
	printf("%d\n",verifica(p,x,n));
	}

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