Cod sursa(job #2075159)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 25 noiembrie 2017 11:37:02
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
struct nod
{
    int cost,nrfii;
    nod *fii[26];
    nod()
    {
        for(int i=0;i<26;++i)
            fii[i]=0;
        cost=0;
        nrfii=0;
    }
}*r;
char txt[30];
int k,leg;
void adaugare(nod *n, char l)
{
    if(l=='\n')
    {
        n->cost++;
        return ;
    }
    if(n->fii[l-'a']==0)
        n->fii[l-'a']=new nod(), n->nrfii++;
    adaugare(n->fii[l-'a'], txt[++k]);
}
int aparitii(nod *n, char l)
{
    if(l=='\n')
        return n->cost;
    if(n->fii[l-'a']==0)
        return 0;
    return aparitii(n->fii[l-'a'],txt[++k]);
}
bool stergere(nod *n, char l)
{
    if(l=='\n')
    {
        n->cost--;
    }
    else if(stergere(n->fii[l-'a'],txt[++k]))
    {
        n->fii[l-'a']=0, n->nrfii--;
    }
    if(n->cost==0 && n->nrfii==0 && n!=r)
    {
        delete n;
        return 1;
    }
    return 0;
}
int prefix(nod *n, char l, int ad=0)
{
    if(n==0)
        return ad-1;
    if(l=='\n')
        return ad;
    return prefix(n->fii[l-'a'],txt[++k],ad+1);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    r=new nod();
    while(fgets(txt,30,stdin))
    {
        k=2;
        //getline(cin,txt);
        if(txt[0]=='0')
        {
            adaugare(r,txt[k]);
        }
        if(txt[0]=='1')
            stergere(r,txt[k]);
        if(txt[0]=='2')
            cout<<aparitii(r,txt[k])<<"\n";
        if(txt[0]=='3')
            cout<<prefix(r,txt[k])<<"\n";
    }
    return 0;
}