Cod sursa(job #765420)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 iulie 2012 16:08:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<cstdio>
#include<cstring>
using namespace std;
struct Nod
{int c,n;
Nod *f[26];
Nod()
     {c=n=0;
     memset(f,0,sizeof(f));}};
char l[32];
Nod *t=new Nod;

void A(Nod *s,char *l) 
{if((*l)=='\n') 
        {++s->c;
        return;}
if(!s->f[(*l)-'a']) 
        s->f[(*l)-'a']=new Nod,++s->n;
A(s->f[(*l)-'a'],l+1);}
            
int D(Nod *s,char *l) 
{if((*l)=='\n') 
        --s->c;
else 
        if(D(s->f[(*l)-'a'],l+1)) 
               s->f[(*l)-'a']=0,--s->n;
if(!s->c&&!s->n&&s!=t) 
      {delete s;
      return 1;}
return 0;}
        
int C(Nod *s,char *l) 
{if((*l)=='\n') 
        return s->c;
if(s->f[(*l)-'a']) 
        return C(s->f[(*l)-'a'],l+1);
return 0;}

int E(Nod *s,char *l,int k) 
{if((*l)=='\n'||!s->f[(*l)-'a']) 
       return k;
return E(s->f[(*l)-'a'],l+1,k+1);}

int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(l,32,stdin);
while(!feof(stdin)) 
     {if(l[0]=='0') 
            A(t,l+2);
     else
     if(l[0]=='1') 
            D(t,l+2);
     else
     if(l[0]=='2')
            printf("%d\n",C(t,l+2));
     else
     if(l[0]=='3') 
            printf("%d\n",E(t,l+2,0));
     fgets(l,32,stdin);}
return 0;}