Cod sursa(job #2300922)

Utilizator ImbuzanRaduImbuzan Radu ImbuzanRadu Data 12 decembrie 2018 12:39:53
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");

struct TRIE
{
    struct TRIE *fiu[30]={0};
    int terminal=0,fr=0;
};

void adauga(char *p,TRIE *T)
{
    if(*p==0)
    {
        T->terminal++;
        return;
    }

    if(T->fiu[*p-'a']==0)
    {
        T->fiu[*p-'a']=new TRIE;
        T->fr++;
    }
    adauga(p+1,T->fiu[*p-'a']);

}///bine
void sterge(char *p,TRIE *T)
{

    if(*p==0)T->terminal--;
    else
    {
        sterge(p+1,T->fiu[*p-'a']);
        if(T->fiu[*p-'a']->fr==0 && T->fiu[*p-'a']->terminal==0)
        {
            delete T->fiu[*p-'a'];
            T->fiu[*p-'a']=0;
            T->fr--;
        }
    }
}

int aparitii(char *p,TRIE *T)
{
    if(*p==0)return T->terminal;
    if(T->fiu[*p-'a']==0)return 0;
    aparitii(p+1,T->fiu[*p-'a']);
}

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

int n,i,caz;
TRIE *T;
char CUV[30];

int main()
{
    T=new TRIE;
    while(in>>caz)
    {
        in>>CUV;
        if(caz==0)adauga(CUV,T);
        if(caz==1)sterge(CUV,T);
        if(caz==2)out<<aparitii(CUV,T)<<'\n';
        if(caz==3)out<<pref(CUV,T)<<'\n';
    }
    return 0;
}