#include #include #include char wejscie[100001], *wsk; /*wejscie*/ char *element[500]; /*tablica wskaznikow do elementow nie-naturalnych*/ int naturalne[500]; /*tablica wskaznikow do elementow naturalnych*/ int tab[100001][200]; /*tablica do sprawdzania, czy element jest naturalny*/ int szer[200]; /*szerokosc do tablicy tab*/ int n; int Lnat(char *wsk); /*zamienia, na naturalne*/ int Sortuj(const void* a, const void* b); /*qsort*/ int Sprawdz(int* zag); /*sprawdzanie, czy naturalna*/ int Element(char* el1, char* el2); /*sprawdza, czy Element*/ int Podzbior(char* el1,char* el2); /*sprawdza, czy Podzbior*/ /*----------------------------------------------------------------------------*/ int main() { int i,zag,l,jest; int nat, nienat; while(gets(wejscie)) { i=0, nienat=0, zag=0, l=0, jest=0, nat=0, n=0; wsk=&wejscie[1]; while(!(zag==0 && *wsk=='}')) { if(zag == 0 && (*(wsk-1)=='{' || *(wsk-1)==',')) { l=Lnat(wsk); if(l!=-1) naturalne[n++]=l; else if(l==-1) { for(i=0, jest=0;i=48 && *wsk<=57) return (*wsk-48); else do{ wsk++; if(*wsk>=48 && *wsk<=57) tab[zagl][szer[zagl]++]=*wsk-48; if(*wsk=='{') zagl++; else if(*wsk=='}') { qsort(tab[zagl],szer[zagl],sizeof(int),Sortuj); if(tab[zagl][0]!=0 || Sprawdz(&zagl)) { l=-1; for(i=0;i<=zagl;i++) szer[i]=0; return l; } if(zagl) tab[zagl-1][szer[zagl-1]++]=tab[zagl][szer[zagl]-1]+1; else if(zagl==0) l=tab[zagl][szer[zagl]-1]+1; szer[zagl]=0; zagl--; } }while(!(zagl==-1 && *wsk=='}')); return l; } /*----------------------------------------------------------------------------*/ int Sortuj(const void* a, const void* b) { return (*(int*)a-*(int*)b); } /*----------------------------------------------------------------------------*/ int Sprawdz(int* zag) { int i,e; for(i=0,e=0; i< szer[*zag]-1 && e!=1;i++) if((tab[*zag][i]!= tab[*zag][i+1]) && (tab[*zag][i]+1!= tab[*zag][i+1])) e=1; return e; } /*----------------------------------------------------------------------------*/ int Element(char* el1, char* el2) { int z; if(Lnat(el2)!=-1) return 0; z=1; el2++; /*---- sprawdzenie dla kazdego elementu w zbiorze tab2 ---*/ while(z) { /*-- rownosc zbiorow <=> gdy maja te same elementy --*/ if(Podzbior(el1,el2)&&Podzbior(el2,el1)) return 1; do { if(*el2=='{') z++; else if(*el2==','); else if(*el2=='}') z--; el2++; }while(z>1); if(*el2=='}') z--; } return 0; } /*----------------------------------------------------------------------------*/ int Podzbior(char* el1,char* el2) { int z=0, n1=0, n2=0; n1=Lnat(el1); if(n1!=-1) { n2=Lnat(el2); if(n1 == n2) return 1; else return 0; } else { z=1; el1++; while(z) { if(!Element(el1,el2)) return 0; do { if(*el1=='{') z++; if(*el1==','); else if(*el1=='}') z--; el1++; }while(z>1); if(*el1=='}') z--; } } return 1; }