Cod sursa(job #1593207)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 8 februarie 2016 13:32:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char v[30];
struct Trie
{
    int nrfii,nrcv;
    Trie *fiu[26];
    Trie()
    {
        nrfii=nrcv=0;
        memset(fiu,0,sizeof(fiu));
    }
};
Trie *Pr=new Trie; //radacina;
void adauga(Trie *nod)
{
    for(int i=0;; i++)
    {
        if(v[i]==0||v[i]=='\n') {nod->nrcv++;break;}
        int CH=v[i]-'a';
        if(nod->fiu[CH]==0)
        {
            nod->fiu[CH]=new Trie;
            nod->nrfii++;
        }
        nod=nod->fiu[CH];
    }
}
bool sterge(Trie *nod,int i)
{
    int CH=v[i]-'a';
    if(v[i]==0||v[i]=='\n')
    {
        nod->nrcv--;
    }
    else if(sterge(nod->fiu[CH],i+1))
    {
        nod->fiu[CH]=0;
        nod->nrfii--;
    }
    if(nod->nrcv==0&&nod!=Pr&&nod->nrfii==0) {delete nod;return 1;}
    return 0;
}
int nr(Trie *nod)
{
    for(int i=0;;i++)
    {
        if(!nod) return 0;
        int CH=v[i]-'a';
        if(v[i]==0||v[i]=='\n') return nod->nrcv;
        nod=nod->fiu[CH];
    }
}
int prefix(Trie *nod)
{
    for(int i=0;;i++)
    {   int CH=v[i]-'a';
        if(v[i]==0||nod->fiu[CH]==0) return i;
        nod=nod->fiu[CH];
    }
}
int main()
{
    int x;
    while(fin>>x>>v)
    {
        if(v[0]==0) break;
        if(x==0) adauga(Pr);
        if(x==1) sterge(Pr,0);
        if(x==2) fout<<nr(Pr)<<"\n";
        if(x==3) fout<<prefix(Pr)<<"\n";
        memset(v,0,sizeof(v));
    }
}