Cod sursa(job #1945676)

Utilizator nicu_serteSerte Nicu nicu_serte Data 29 martie 2017 17:08:35
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
    int cnt, fii;
    Trie *fiu[30];
    Trie()
    {
        fii=cnt=0;
        for(int i=0; i<30; i++)
            fiu[i]=0;
    }
};
Trie *T=new Trie;
void add(Trie *nod, char *s)
{
    if(*s=='\0')
    {
        nod->cnt++;
        return;
    }
    if(!nod->fiu[*s-'a'])
    {
        nod->fiu[*s-'a']=new Trie;
        nod->fii++;
    }
    add(nod->fiu[*s-'a'], s+1);
}
int del(Trie *nod, char *s)
{
    if(*s=='\0')
        nod->cnt--;
    else if(del(nod->fiu[*s-'a'], s+1))
    {
        nod->fii--;
        nod->fiu[*s-'a']=0;
    }
    if(nod->cnt==0 && nod->fii==0 && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int aparitii(Trie *nod, char *s)
{
    if(*s=='\0')
        return nod->cnt;
    if(nod->fiu[*s-'a'])
        return aparitii(nod->fiu[*s-'a'], s+1);
    return 0;
}
int prefix(Trie *nod, char *s, int l)
{
    if(*s=='\n' || !nod->fiu[*s-'a'])
        return l;
    return prefix(nod->fiu[*s-'a'], s+1, l+1);
}
int main()
{
    char s[32];
    int op;
    while(fin>>op>>s)
    {
        if(op==0)
            add(T, s);
        else if(op==1)
           del(T, s);
        else if(op==2)
            fout<<aparitii(T, s)<<'\n';
        else if(op==3)
            fout<<prefix(T, s, 0)<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}