Cod sursa(job #2942600)

Utilizator andreimocianAndrei Mocian andreimocian Data 19 noiembrie 2022 21:57:50
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#define ch (*s - 'a')

using namespace std;

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

int t;
char s[30];

struct Trie
{
    int nr_cuv;
    int nr_fii;
    Trie *fiu[30];
    Trie()
    {
        nr_cuv = nr_fii = 0;
        for (int i = 0; i < 26; i++)
            fiu[i] = 0;
    }
};

Trie *T = new Trie;

void Add(Trie *nod, char *s)
{
    if (*s == 0)
    {
        nod->nr_cuv++;
        return;
    }
    if(nod->fiu[ch] == 0)
    {
        nod->fiu[ch] = new Trie;
        nod->nr_fii++;
    }
    Add(nod->fiu[ch], s+1);
}

bool Delete(Trie *nod, char *s)
{
    if(*s == 0)
        nod->nr_cuv--;
    else
    {
        if(Delete(nod->fiu[ch], s+1))
        {
            nod->fiu[ch] = 0;
            nod->nr_fii--;
        }
    }
    if(nod->nr_fii == 0 && nod->nr_cuv == 0 && nod != T)
    {
        delete nod;
        return true;
    }
    return false;
}

int Query(Trie *nod, char *s)
{
    if(*s == 0)
        return nod->nr_cuv;
    if(nod->fiu[ch] != 0)
        return Query(nod->fiu[ch], s+1);
    return 0;
}

int Prefix(Trie *nod, char *s, int len)
{
    if(*s == 0 || nod->fiu[ch] == 0)
        return len;
    return Prefix(nod->fiu[ch], s+1, len+1);

}

int main()
{
    while (fin >> t >> s)
    {
        if(t == 0)
            Add(T, s);
        else if(t == 1)
            Delete(T, s);
        else if(t == 2)
            fout << Query(T, s) << "\n";
        else if(t == 3)
            fout << Prefix(T, s, 0) << "\n";
    }
    return 0;
}