Cod sursa(job #1214901)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 31 iulie 2014 17:54:22
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
    int fii;
    int ap;
    Trie *v[26];
    Trie()
    {
        ap=0;fii=0;
        memset(v,0,sizeof(v));
    }
};
Trie *T=new Trie;
void ins(char *s,Trie *nod)
{
    if(*s == 0)
    {
        nod->ap++;
        return;
    }
    int CH=*s-'a';
    if(nod->v[CH]==NULL)
    {
        nod->v[CH]=new Trie();
        nod->fii++;
    }
    ins(s+1,nod->v[CH]);
}
int del(char *s,Trie *nod)
{
    int CH=*s-'a';
    if(*s == 0 )
    {
        nod->ap--;
    }
    else
    {
        if(del(s+1,nod->v[CH])==1)
        {
            nod->v[CH] = NULL ;
            nod->fii--;
        }
    }
    if(nod->fii==0&&nod->ap==0&&nod!=T)
    {
        return 1;
    }
    return 0;
}
int caut(char *s,Trie *nod)
{
    if(*s == 0)
    {
        return nod->ap;
    }
    int CH=*s-'a';
    if(nod->v[CH]==NULL)
        return 0;
    return caut(s+1,nod->v[CH]);
}
int prefix(char* s,Trie *nod,int rasp)
{
    int CH=*s-'a';
    if(*s != 0)
    {
        if(nod->v[CH]==NULL)
            return rasp;
        return prefix(s+1,nod->v[CH],rasp+1);
    }
    return rasp;
}
int main()
{
    int op;
    char cuv[40];
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while(!feof(stdin))
    {
        scanf("%d",&op);
        scanf("%s\n",&cuv);
        if(op==0)
        {
            ins(cuv,T);
        }
        if(op==1)
        {
            del(cuv,T);
        }
        if(op==2)
        {
            printf("%d\n",caut(cuv,T));
        }
        if(op==3)
        {
            printf("%d\n",prefix(cuv,T,0));
        }
    }
    return 0;
}