All pastes #67269 Raw Edit

moc zbioru

public c v1 · immutable
#67269 ·published 2006-06-19 17:52 UTC
rendered paste body
#include <stdio.h>#include <string.h>#include <stdlib.h>int porownaj(char *, char *);int czyNaturalna(char *);int compare(const void *x, const void *y);int czyElement(char *, char*);int czyPodzbior(char*, char*);char zbior[100001], *stos[1000], *elem[1000], *wsk;int wynik=1;int main(){    int zag=0, i=0, ile_el, ile_stos, j=0, a=0, b=0, pom;        while(scanf("%s", &zbior)!=EOF)    {	        zag=0;	/*czyNaturalna(zbior);*/	wsk=&zbior[1];	/***************dodaj na wskanik do elementu na stos********************/	while((*wsk)!='\0')	{	    	    if(zag==0)	    {		if(*wsk>='0' && *wsk<='9')		{		    elem[i++]=wsk; /*printf("%c", *elem[i-1]);*/		    while(*wsk>='0' && *wsk<='9') wsk++;		}		else if(*wsk=='{') 		{ 		    elem[i++]=wsk; /*printf("%c", *elem[i-1]);*/ zag++;		}	    }	    else if(zag>0)	    {		if(*wsk=='}') { zag--;}		if(*wsk=='{') zag++;	    }	    wsk++;	}/***********************************************************************/	ile_el=i;	if(ile_el==0) wynik=1; /*jesli istnieje tylko 1 element, to moc=1*/	else	{	    stos[0]=elem[0]; /*odkladamy na drugi stos pierwszy element*/	    wynik=1;	    	    for(i=1; i<ile_el; i++) /*porownuje nastepny el. z tymi, ktore sa na stosie*/	    {		for(j=0; j<wynik; j++) /* 'j', to poprzednie elementy stosu*/		{		    if(porownaj(elem[i],stos[j])==1 && porownaj(stos[j],elem[i])==1) /*takie same*/		    {			pom=0; break;		    }		    else		    {			pom=1;		    }		}		if(pom==1) 		{		    stos[wynik]=elem[i]; wynik++;		}	    }	}	/*printf("\telementow:%d   wynik:%d\n", ile_el, wynik);*/	printf("%d ", wynik);	memset(stos,0,sizeof(char *)*1000);	wynik=1;pom=i=0;    }    return 0;}int czyNaturalna(char *a){    int liczby[150][500], ile[150],zag=0, wyniczek=1, liczba=0, i=0, j=0;    char tabnat[4];        memset(tabnat,0, sizeof(char)*4);    memset(ile, 0, sizeof(int)*150);    memset(liczby, 0, sizeof(int)*150*500);    if(*a>='0' && *a<='9') {/*printf(" naturalna%d ", *a - 48);*/return (*a-48);}    else    {	a++;	do	{	    	    if(*a=='{') zag++;	    else if(*a=='}') 	    {		qsort(liczby[zag], ile[zag], sizeof(int), compare);				if(zag==0)		{		    if(liczby[0][0]==0)		    {			if(ile[0]==1) 			{if(wyniczek==1) /*return wyniczek-1; else*/ return wyniczek;}			else			{			    for(i=0; i+1<ile[0]; i++)			    {				if(liczby[0][i]==liczby[0][i+1]);				else if(liczby[0][i+1]==liczby[0][i]+1) wyniczek++;				else return -1;			    }			    return wyniczek;			}		    }		    else return -1;		}		else if(liczby[zag][0]==0) /*pierwszy el. musi byc 0*/		{		    if(ile[zag]>1) /*liczb w zagniezdzeniu wiecej niz 1*/		    {			for(i=0; i+1<=ile[zag]; i++)			{			    if(liczby[zag][i]==liczby[zag][i+1] || liczby[zag][i+1]==(liczby[zag][i]+1));			    else return -1;			}			liczby[zag-1][ile[zag-1]++]=liczby[zag][i]; /*na koncu nizszego zagniezdzenia dopisujemy najwiekszy el.*/		    }		    else 		    {			liczby[zag-1][ile[zag-1]++]=1;		    } 		}		else		{		    return -1;		}		zag--;	    }	    else if(*a>='0' && *a<='9')	    {		while((*a)>='0' && (*a)<='9') /*zamiana liczby ze stringa na inta*/		{		    tabnat[i]=(*a);		    i++;		    a++;		}		liczba=atoi(tabnat);		/*printf("  ile[zag]=%d", ile[zag]);*/   		ile[zag]++;				liczby[zag][ile[zag]-1]=liczba; /*zapisanie liczby do tablicy "liczby"*/				memset(tabnat,0, sizeof(char)*3);		i=0; a--;	    	    	    }	    a++;	} while(zag>=0);    }        /*printf(" liczba:%d  zag:%d", wyniczek, ile[0]);*/        return liczba;}int porownaj(char *a, char *b){    int alfa, beta;        alfa=czyNaturalna(a);    beta=czyNaturalna(b);    if(alfa!=-1 && beta!=-1 && alfa!=beta) {/*printf("\n 1 ");*/ return 0;}    else if(alfa!=-1 && beta!=-1 && alfa==beta) {/*printf("\n 2chuje ");*/return 1;}    else if((alfa==-1 || beta==-1) && alfa!=beta) {/*printf("\n -1 ");*/return 0;}    else if(alfa==-1 && beta==-1)     {	printf(" -3 ");	if(czyPodzbior(a,b) && czyPodzbior(b,a)) {/*printf("chuj")*/;return 1;}	/*if(czyPodzbior(a,b)==1 && czyPodzbior(b,a)==1) return 1;*/	else return 0;    }}int compare(const void *x, const void *y){    const int *X=(const int *)x;    const int *Y=(const int *)y;    return(X-Y);}int czyElement(char *x, char *y){    long long int zag=0; /*poziom zaglebienia (nawiasy)*/        if(czyNaturalna(x)) return 1;    else    {	while(*y!='}')	{	    y++;	    	    if(czyPodzbior(x, y) && czyPodzbior(y, x)) return 1; /* rwnowano zbiorw*/	    	    if(*y==',') y++; /*przejscie do nastepnego el. po napotkaniu ','*/	  	      	    do	    {		if(*y=='{') zag++;		if(*y=='}') zag--;		y++;	    } while(zag!=0);	}    }    zag=0;        return 0;}int czyPodzbior(char *x, char *y){    long long int zag=0;    int alfa, beta;        alfa=czyNaturalna(x);    if(alfa!=-1)     {	beta=czyNaturalna(y);	if(alfa==beta) return 1;	else return 0;    }    else    {	while(*x!='}')	{	    x++;	    	    if(!czyElement(x, y)) return 0;	    	    if(*x==',') x++;		        	    do	    {		if(*x=='{') zag++;		if(*x=='}') zag--;		x++;	    } while(zag!=0);	}    }        return 1;}