Cod sursa(job #2375994)

Utilizator dacianouaPapadia Mortala dacianoua Data 8 martie 2019 13:15:25
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#define mmax 20
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char aux[mmax+1];
short int op;
struct trie
{
    int fii,aparitii;
    trie *fiu[26];
    trie()
    {
        fii=aparitii=0;
        for(int i=0;i<26;i++)
            fiu[i]=NULL;
    }
}*root;
void adauga(trie *nod,char *s)
{
    if(*s==NULL)
    {
        nod->aparitii++;
        return ;
    }
    if(nod->fiu[*s-'a']==NULL)
    {
        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']->aparitii==0 && nod->fiu[*s-'a']->fii==0)
    {
        delete nod->fiu[*s-'a'];
        nod->fiu[*s-'a']=0;
        nod->fii--;
    }
}
int tipar(trie *nod, char *s)
{
    if(*s==NULL)
        return nod->aparitii;
    if(!nod->fiu[*s-'a'])
        return 0;
    return tipar(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()
{
    root=new trie;
    while(fin>>op>>aux)
        switch(op)
    {
    case 0:
        adauga(root,aux);
        break;
    case 1:
        sterge(root,aux);
        break;
    case 2:
        fout<<tipar(root,aux)<<"\n";
        break;
    case 3:
        fout<<prefix(root,aux)<<"\n";
    }
    return 0;
}