Cod sursa(job #432900)

Utilizator MKLOLDragos Ristache MKLOL Data 2 aprilie 2010 22:11:43
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<algorithm>
#include<iostream>
using namespace std;
#define SIGMA 26
struct trie
{
int nod,nrfii;
trie *next[SIGMA];
    trie()
    {
    nod=nrfii=0;
    memset(next,0,sizeof( next ) );
    }
};
trie *T = new trie;
char sir[5000];
int N,a;
int adauga(trie *anod,char *s)
{
if(*s=='\n')
    {
        anod->nod ++;
        return 0;
    }
    if(anod->next[*s-'a'] == 0)
    {
        anod->next[*s-'a']=new trie;
        anod->nrfii++;
    }
    adauga(anod->next[ *s-'a' ],s+1);
    return -1;
}
int sterge(trie *anod,char *s)
{
//printf("%c",*s);
    if(*s=='\n')
        anod->nod--;
    else if( sterge( anod->next[ *s-'a' ],s+1))
    {//printf("!");
        anod->next[ *s-'a' ] = 0;
        anod->nrfii--;
    }
    if(anod->nod == 0&&anod->nrfii==0&& anod!= T )
    {//printf("!");
        delete anod;
        return 1;
    }
return 0;
}
int afis(trie *anod, char *s)
{
    if(*s=='\n')
        return anod->nod;
    if(anod -> next  [*s - 'a'])
        return afis(anod->next[*s-'a'],s+1);
    return 0;
}
int ver(trie *anod,char *s,int k)
{
    if(*s=='\n' || !anod->next[*s-'a'])
        return k;
    return ver(anod->next[*s-'a'],s+1,k+1);
    return 0;
}
int x=0;
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);

   while(scanf("%d ",&a)==1)
    {
    x=0;
  //  printf("%d", a);
    fgets(sir,32,stdin);
    if(a==0)
    x=adauga(T,sir);
    if(a==1)
    x=sterge(T,sir);
    if(a==2)
    {
    x=afis(T,sir);
    printf("%d\n",x);
    }
    if(a==3)
    {

    printf("%d\n",ver(T,sir,0));
    }
  //  cout<<sir;
    }
}