Cod sursa(job #1917661)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 9 martie 2017 12:43:55
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
    int nrfii,nrcuv;
    Trie *fiu[26];
    Trie()
    {
        nrfii=nrcuv=0;
        memset(fiu,0,sizeof(fiu));
    }
};
Trie *root=new Trie;
char v[25];
void adauga(Trie *nod)
{
    for(int i=0;;i++)
    {
        if(v[i]==0 || v[i]=='\n')
        {
            nod->nrcuv++;
            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->nrcuv--;
    }
    else if( sterge(nod->fiu[ch],i+1)==1)
    {
        nod->nrfii--;
        nod->fiu[ch]=0;
    }
    if(nod->nrcuv==0 && nod!=root && nod->nrfii==0)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int aparitii(Trie *nod)
{
    for(int i=0;;i++)
    {
        if(nod==0) return 0;
        if(v[i]==0 || v[i]=='\n') return nod->nrcuv;
        nod=nod->fiu[ v[i]-'a' ];
    }
}
int prefix(Trie *nod)
{
    for(int i=0;;i++)
    {
        int ch=v[i]-'a';
        if(v[i]==0 || v[i]=='\n' || 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(root);
        if(x==1) sterge(root,0);
        if(x==2) fout<<aparitii(root)<<"\n";
        if(x==3) fout<<prefix(root)<<"\n";
        memset(v,0,sizeof(v));
    }
}