Cod sursa(job #2479246)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 23 octombrie 2019 16:42:42
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie
{
    int nrfii,fr;
    trie *leg[26];
    trie()
    {
        for(int i = 0 ; i < 26 ; i++)
            leg[i] = 0;
        nrfii = fr = 0;
    }
};

trie *rad = new trie;
char s[30];

inline void Add(trie *nod,char *s)
{
    if(*s == '\0')
    {
        nod->fr++;
        return;
    }
    if(nod->leg[*s-'a'] == 0)
    {
        nod->leg[*s-'a'] = new trie;
        nod->nrfii++;
    }
    Add(nod->leg[*s-'a'],s+1);
}

inline int Search(trie *nod, char *s)
{
    if(*s == '\0')
        return nod->fr;
    if(nod->leg[*s-'a'] == 0)
        return 0;
    return Search(nod->leg[*s-'a'],s+1);
}

inline int lg(trie *nod, char *s, int len)
{
    if(*s == 0 || nod->leg[*s-'a'] == 0)
        return len;
    return lg(nod->leg[*s-'a'],s+1,len+1);
}

inline int Delete(trie *nod, char *s)
{
    if(*s == '\0')
        nod->fr--;
    else
        if(Delete(nod->leg[*s-'a'],s+1))
        {
            nod->nrfii--;
            nod->leg[*s-'a'] = 0;
        }
    if(nod->nrfii == 0 && nod->fr == 0 && nod != rad)
    {
        delete nod;
        return true;
    }
    return false;
}

int main()
{
    int tip , ok;
    while(fin>>tip>>s)
    {
        if(!tip) Add(rad,s);
        else if(tip == 1)
            ok = Delete(rad,s);
        else if(tip == 2)
            fout << Search(rad,s) << "\n";
        else
            fout << lg(rad,s,0) << "\n";
    }
    return 0;
}