Cod sursa(job #1362462)

Utilizator delia_99Delia Draghici delia_99 Data 26 februarie 2015 12:48:17
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <cstring>
using namespace std;
int op;
char s[35];

struct Trie
{
    int nr,nrfii;
    Trie *fii[35];
    Trie()
    {
        nrfii=0;nr=0;
        for(int i=0;i<='z'-'a';++i)
          fii[i]=NULL;
    }
};
Trie *T;

void add(Trie *T,char *s)
{
    if(strlen(s)==0)
    {
        T->nr++;
        return;
    }
    if(T->fii[*s-'a']==NULL)
    {
        T->fii[*s-'a']=new Trie;
        T->nrfii++;
    }
    add(T->fii[*s-'a'],s+1);
}

void remove(Trie *T,char *s)
{
    if(strlen(s)==0)
    {
        T->nr--;
        return;
    }
    remove(T->fii[*s-'a'],s+1);
    if(T->fii[*s-'a']->nrfii==0 && T->fii[*s-'a']->nr==0)
    {
        T->nrfii--;
        T->fii[*s-'a']=NULL;
    }
}

int nraparitii(Trie *T,char *s)
{
   if(T==NULL)
     return 0;
   if(strlen(s)==0)
     return T->nr;
   nraparitii(T->fii[*s-'a'],s+1);
}

int prefix(Trie *T,char *s)
{
    if(strlen(s)==0 || T->fii[*s-'a']==NULL)
      return strlen(s);
    prefix(T->fii[*s-'a'],s+1);
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    T=new Trie;
    while(!feof(stdin))
    {
        scanf("%d %s\n",&op,s);
        if(op==0)  add(T,s);
        if(op==1)  remove(T,s);
        if(op==2)  printf("%d\n",nraparitii(T,s));
        if(op==3)  printf("%d\n",strlen(s)-prefix(T,s));
    }
    return 0;
}