Cod sursa(job #2336111)

Utilizator dacianouaPapadia Mortala dacianoua Data 4 februarie 2019 19:57:26
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char cuv[25];
int op;
struct trie
{
    int aparitii,fii;
    trie *fiu[26];
    trie()
    {
        aparitii=fii=0;
        memset(fiu,0,sizeof(fiu));
    }
}*tata;
void adauga(trie *nod,char *s)
{
    if(*s==NULL)
    {
        nod->aparitii++;
        return;
    }
    if(!nod->fiu[*s-'a'])
    {
        nod->fiu[*s-'a']=new trie;
        nod->fii++;
    }
    adauga(nod->fiu[*s-'a'],s+1);
}
void sterge(trie *nod,char *s)
{
    if(*s==NULL)
    {
        nod->aparitii--;
        return ;
    }
    sterge(nod->fiu[*s-'a'],s+1);
    if(!nod->fiu[*s-'a']->fii && !nod->fiu[*s-'a']->aparitii)
    {
        delete nod->fiu[*s-'a'];
        nod->fii--;
        nod->fiu[*s-'a']=NULL;
    }
}
int numar(trie *nod, char *s)
{
    if(*s==NULL)
        return nod->aparitii;
    if(!nod->fiu[*s-'a'])
        return 0;
    return numar(nod->fiu[*s-'a'],s+1);
}
int prefix(trie *nod, char *s)
{
    if(*s==NULL)
        return 0;
    if(!nod->fiu[*s-'a'])
        return 0;
    return prefix(nod->fiu[*s-'a'],s+1)+1;
}
int main()
{
    tata=new trie;
    while(fin>>op>>cuv)
    {
        if(op==0)
        {
            adauga(tata,cuv);
            continue;
        }
        if(op==1)
        {
            sterge(tata,cuv);
            continue;
        }
        if(op==2)
        {
            fout<<numar(tata,cuv)<<"\n";
            continue;
        }
        fout<<prefix(tata,cuv)<<"\n";
    }
    return 0;
}