Cod sursa(job #2202225)

Utilizator ianiIani Biro iani Data 7 mai 2018 22:32:30
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>

using namespace std;

struct Trie
{
    int nrap,nrfii;
    Trie *fiu[26];
    
    Trie()
    {
        nrap=nrfii=0;
        for (int i=0; i<26; i++)
            fiu[i]=0;
    }
};

Trie *T=new Trie;

void ad(Trie *nod, char *s)
{
    if (*s=='\0')
    {
        nod->nrap++;
        return;
    }
    if (nod->fiu[*s-'a']==0)
    {
        nod->fiu[*s-'a'] = new Trie;
        nod->nrfii++;
    }
    ad(nod->fiu[*s-'a'],s+1);
}

bool sterge(Trie *nod, char *s)
{
    if (*s=='\0')
        nod->nrap--;
    else if (sterge(nod->fiu[*s-'a'],s+1))
    {
        nod->fiu[*s-'a']=0;
        nod->nrfii--;
    }
    if (nod->nrap==0 && nod->nrfii==0 && nod!=T)
    {
        delete nod;
        return true;
    }
    return false;
}

int ap(Trie *nod,char *s)
{
    if (*s=='\0')
        return nod->nrap;
    if (nod->fiu[*s-'a']!=0)
        return ap(nod->fiu[*s-'a'],s+1);
    return 0;
}

int lpref(Trie *nod, char *s, int k)
{
    if (*s=='\0' || nod->fiu[*s-'a']==0)
        return k;
    return lpref(nod->fiu[*s-'a'],s+1,k+1);
}

int main()
{
    ifstream fin ("trie.in");
    ofstream fout ("trie.out");
    char cer,a[21];
    while (fin>>cer)
    {
        fin>>a;
        switch(cer)
        {
            case '0':
            {
                ad(T,a);
                break;
            }
            case '1':
            {
                sterge(T,a);
                break;
            }
            case '2':
            {
                fout<<ap(T,a)<<'\n';
                break;
            }
            case '3':
            {
                fout<<lpref(T,a,0)<<'\n';
                break;
            }
        }
    }
    return 0;
}