All pastes #67317 Raw Edit

Something

public text v1 · immutable
#67317 ·published 2006-06-19 19:19 UTC
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;
}