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;}