Cod sursa(job #2158089)

Utilizator delia.tudosieTudosie Delia delia.tudosie Data 10 martie 2018 10:26:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct trie
{
    int cnt,nr;
    trie *son[30];
    trie()
    {
        cnt=0;
        nr=0;
        for(int i=0; i<='z'-'a'; ++i)
            son[i]=NULL;
    }
}*T;

int tip;
char s[25];

void adauga(trie *T,char *s)
{
    int c=*s-'a';
    if(strlen(s)==0)
    {
        T->cnt++;
        return;
    }
    if(T->son[c]==NULL)
    {
        T->son[c]=new trie;
        T->nr++;
    }
    adauga(T->son[c],s+1);
}

void sterge(trie *T,char *s)
{
    if(strlen(s)==0)
    {
        T->cnt--;
        return;
    }
    int c=*s-'a';
    sterge(T->son[c],s+1);
    if(T->son[c]->nr==0 && T->son[c]->cnt==0)
    {
        T->nr--;
        T->son[c]=NULL;
    }
}

int nrap(trie *T,char *s)
{
    if(T==NULL)
        return 0;
    if(strlen(s)==0)
        return T->cnt;
    nrap(T->son[*s-'a'],s+1);
}

int prefix(trie *T,char *s)
{
    if(strlen(s)==0 || T->son[*s-'a']==NULL)
        return 0;
    return 1+prefix(T->son[*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",&tip,&s);
        if(tip==0)
            adauga(T,s);
        if(tip==1)
            sterge(T,s);
        if(tip==2)
            printf("%d\n",nrap(T,s));
        if(tip==3)
            printf("%d\n",prefix(T,s));
    }
    return 0;
}