Cod sursa(job #2058190)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 5 noiembrie 2017 11:41:07
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<fstream>
#include<string.h>
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
typedef struct trie
{
    struct trie *fiu[26];
    int ap,nrfii;
    trie()
    {
        ap=nrfii=0;
        memset(fiu,NULL,sizeof(fiu));
    }
} NOD, *TRIE;
TRIE Trie;

void adauga(TRIE &T, char *p)
{
    if((*p)=='\0')
    {
        T->ap++;
        return;
    }
    if(T->fiu[(*p)-'a']==NULL)
    {
        T->fiu[(*p)-'a']=new NOD;
        T->nrfii++;
    }
    adauga(T->fiu[(*p)-'a'],p+1);
}

bool del(TRIE &T, char *p)
{
    if((*p)=='\0')
    {
        T->ap--;
        if(T->ap==0)
        {
            delete(T);
            T=NULL;
            return 1;
        }
        return 0;
    }
    else
    {
        bool val=del(T->fiu[(*p)-'a'],p+1);
        if(val==1)
        {
            T->fiu[(*p)-'a']=NULL;
            T->nrfii--;
        }
        if(T->ap==0 && T->nrfii==0 && T!=Trie)
        {
            delete(T);
            T=NULL;
            return 1;
        }
        return 0;
    }
}

int numara(TRIE T, char *p)
{
    if((*p)=='\0')
        return T->ap;
    if(T->fiu[(*p)-'a']!=NULL)
        return numara(T->fiu[(*p)-'a'],p+1);
    return 0;
}

int prefix(TRIE T, char *p, int k)
{
    if((*p)=='\0' || T->fiu[(*p)-'a']==NULL)
        return k;
    return prefix(T->fiu[(*p)-'a'],p+1,k+1);
}

int tip;
char S[21];
int main()
{
    Trie=new NOD;
    while(fi>>tip)
    {
        fi>>S;
        if(tip==0)
            adauga(Trie,S);
        if(tip==1)
            del(Trie,S);
        if(tip==2)
            fo<<numara(Trie,S)<<"\n";
        if(tip==3)
            fo<<prefix(Trie,S,0)<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}