Cod sursa(job #357403)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 19 octombrie 2009 10:40:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#include <string.h>
#define sigma 27
#define Ls 35
using namespace std;

struct Trie{
	int nrc,nrf;
   Trie *son[sigma];
   Trie(){
   	nrc=nrf=0;
      memset(son,0,sizeof(son));
   }
};

Trie *T = new Trie;
char s[Ls];

void add(Trie *t, char *s){
	if( *s == '\n' ){
   	t->nrc++;
      return ;
   }
   if( t-> son[( *s-'a' )] )
   	add(t-> son[( *s-'a' )], s+1);
   else{
      t-> son[(*s-'a')] = new Trie;
   	t->nrf++;
   	add(t-> son[( *s-'a' )],s+1);
   }
}

int del(Trie *t, char *s){
	if( *s == '\n' )
   	   t->nrc--; else
   if( del( t-> son[( *s-'a' )], s+1 )){
   	t-> son[(*s-'a')] =0;
      t-> nrf --;
   }
   if( t->nrc == 0 && t->nrf == 0 && t!=T){
   	delete t; return 1;
   }
   return 0;
}

int numw( Trie *t, char *s){
  if ( *s == '\n' )
   	return t->nrc;
  
  if( t-> son[( *s-'a' )])
     return numw(t->  son[( *s-'a') ] , s+1);
  return 0;
}

int numpr( Trie *t, char *s,int q){
	if( *s=='\n' || t-> son[( *s-'a' )]  == 0 )
   	return q;
   return numpr(t-> son[( *s-'a' )], s+1, q+1);
}

int main(){
	freopen("trie.in","r",stdin);
   freopen("trie.out","w",stdout);
   for( fgets(s,Ls,stdin); !feof(stdin); fgets(s,Ls,stdin)){
   	switch( s[0] ){
      	case '0' : add(T,s+2); break;
         case '1' : del(T,s+2); break;
         case '2' : printf("%d\n",numw(T,s+2)); break;
         case '3' : printf("%d\n",numpr(T,s+2,0)); break;
      }
   }

   fclose(stdin); fclose(stdout);
   return 0;
}