Cod sursa(job #2772744)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 2 septembrie 2021 18:16:00
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct trie
{
    int fii, nr;
    trie* F[26];

    trie()
    {
        fii = nr = 0;
        for(int i = 0; i < 26; i++)
            F[i] = 0;
    }
};

trie* rad = new trie;
int ops;
char s[25];

void adauga(trie* p, char *s)
{
    if(*s == 0)
        p -> nr++;
    else
    {
        if(!p -> F[*s - 'a'])
        {
            trie* t = new trie;
            p -> F[*s - 'a'] = t;
            p -> fii++;
        }
        adauga(p -> F[*s - 'a'], s + 1);
    }
}

bool stergere(trie*& p, char*s)
{
    if(*s != 0)
    {
        if(stergere(p -> F[*s - 'a'], s + 1))
        {
            p -> fii--;
            if(p -> nr == 0 && p -> fii == 0 && p != rad)
            {
                delete p;
                p = 0;
                return 1;
            }
        }
    }
    else
    {
        p -> nr--;
        if(p -> nr == 0 && p -> fii == 0 && p != rad)
            {
                delete p;
                p = 0;
                return 1;
            }
    }
    return 0;
}

int query(trie* p, char* s)
{
    if(*s != 0)
    {
        if(p -> F[*s - 'a'])
            return query(p -> F[*s - 'a'], s + 1);
        else
            return 0;
    }
    return p -> nr;
}

int prefix(trie* p, char* s)
{
    if(*s == 0)
        return 0;
    if(p -> F[*s - 'a'])
        return 1 + prefix(p -> F[*s - 'a'], s + 1);
    return 0;
}

int main()
{
    while(f >> ops >> s)
    {
        trie* p = rad;
        if(ops == 0)
            adauga(p, s);
        if(ops == 1)
            stergere(p, s);
        if(ops == 2)
            g << query(p, s) << "\n";
        if(ops == 3)
            g << prefix(p, s) << "\n";
    }

    return 0;
}