Cod sursa(job #3177314)

Utilizator StefanL2005Stefan Leustean StefanL2005 Data 28 noiembrie 2023 22:32:10
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define p_Int (*p - 'a')

struct  Trie{
    int word, fii;
    vector<Trie*> fiu;

    Trie() {
        word = fii = 0;
        fiu = vector<Trie*> (26, 0);
    }
};
Trie *Root = new Trie;

void insert(Trie *Nod, char *p)
{
    if (*p == '\0')
    {
        Nod->word++;
        return;
    }
    if (Nod->fiu[p_Int] == 0)
    {    
        Nod->fiu[p_Int] = new Trie;
        Nod->fii++;
    }

    insert(Nod->fiu[p_Int], p + 1);
}

int delete_word(Trie *Nod, char *p)
{
    if (*p == '\0')
        Nod->word--;
    else
        if ( delete_word(Nod->fiu[p_Int], p + 1) )
        {
            Nod->fiu[p_Int] = 0;
            Nod->fii--;
        }
    
    if ( Nod->word == 0 && Nod->fii == 0 && Nod != Root)
    { delete Nod; return 1; }
    return 0;
}

int word_que(Trie *Nod, char *p)
{
    if (*p == '\0')
        return Nod->word;
    if (Nod->fiu[p_Int] != 0)
        return word_que(Nod->fiu[p_Int], p + 1);
    return 0;
}

int longest_pre(Trie *Nod, char *p, int k)
{
    if (*p == '\0' || Nod->fiu[p_Int] == 0)
        return k;
    return longest_pre(Nod->fiu[p_Int], p + 1, k + 1);
}

int main()
{
    int type;

    while (in>> type)
    {
        string w; in>> w;
    
        switch(type)
        {
            case 0: { insert(Root, &w[0]); break;}
            case 1: { delete_word(Root, &w[0]); break;}
            case 2: { out<< word_que(Root, &w[0]) << "\n"; break;}
            case 3: { out<< longest_pre(Root, &w[0], 0) << "\n"; break;}
        }
    }

    return 0;
}