rendered paste body#include <stdio.h>
#include <string.h>
#include <stdlib.h>
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<nienat && jest==0;i++)
if(Podzbior(element[i],wsk)&&Podzbior(wsk,element[i]))
jest=1;
if(jest == 0 || nienat==0) element[nienat++]=wsk;
}
}
if(*wsk=='{') zag++;
else if(*wsk=='}') zag--;
wsk++;
}
qsort(naturalne,n,sizeof(int),Sortuj);
if(n!=0)
{
for(nat=1,i=1; i<n; i++)
if(naturalne[i]!=naturalne[i-1]) nat++;
}
printf("%d ",nat + nienat);
memset(wejscie,'\0',100001*sizeof(char));
memset(naturalne,0,500*sizeof(int));
}
return 0;
}
/*----------------------------------------------------------------------------*/
int Lnat(char *wsk)
{
int zagl=0;
int i=0;
int l=0;
if(*wsk>=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;
}