Cod sursa(job #1718122)

Utilizator cubaLuceafarul cuba Data 16 iunie 2016 17:46:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
#define ch (*s-'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie{

    int nr_fii;
    int nr_cuv;
    Trie *fiu[30];
    Trie()
    {
        nr_fii=0;
        nr_cuv=0;
        memset(fiu,0,sizeof(fiu));
    }

};
Trie *T = new Trie;
char s[30];
inline void Add(Trie *nod,char *s)
{
    if(*s==0)
    {
        nod->nr_cuv++;
        return;
    }
    if(nod->fiu[ch]==NULL)
    {
        nod->fiu[ch]= new Trie;
        nod->nr_fii++;
    }
    Add(nod->fiu[ch],s+1);
}
inline bool Delete(Trie *nod,char *s)
{
    if(*s==0)
        nod->nr_cuv--;
    else
        if(Delete(nod->fiu[ch],s+1)==1)
        {
            nod->fiu[ch]=0;
            nod->nr_fii--;
        }
    if(nod->nr_fii==0 && nod->nr_cuv==0 && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
inline int Freq(Trie *nod, char *s)
{
    if(*s==0)
        return nod->nr_cuv;
    if(nod->fiu[ch]!=0)
        return Freq(nod->fiu[ch],s+1);
    return 0;
}
inline int Prefix(Trie *nod,char *s,int lng)
{
    if(*s==0 || nod->fiu[ch]==0)
        return lng;
    return Prefix(nod->fiu[ch],s+1,lng+1);
}
int main()
{
    while(f.getline(s,30))
    {
        if(s[0]=='0')
            Add(T,s+2);
        if(s[0]=='1')
            Delete(T,s+2);
        if(s[0]=='2')
            g<<Freq(T,s+2)<<"\n";
        if(s[0]=='3')
            g<<Prefix(T,s+2,0)<<"\n";
    }
    return 0;
}