Cod sursa(job #2461666)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 25 septembrie 2019 22:12:34
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define Nmax 24

using namespace std;

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

int n, l;
string s;
int cuvinte;

struct trie{

int nrcuv;
int fr;
trie *fii[26];
    trie()
    {
        fr=0;
        nrcuv=0;
        for (int i = 0; i < 26; i++) fii[i]=0;
    };
};

trie *rad= new trie;

void adauga(trie *nod, int pc)
{
    if (pc == l)
    {
        (nod->nrcuv)++;
        return;
    }
    if (nod->fii[s[pc]-'a'] == 0)
    {
        nod->fii[s[pc]-'a'] = new trie;
        (nod->fr)++;
    }
    adauga(nod->fii[s[pc]-'a'], pc+1);
}

bool sterge(trie *nod, int pc)
{
    if (pc == l)
    {
        (nod->nrcuv)--;
    }
    else if (sterge(nod->fii[s[pc]-'a'], pc+1))
    {
        (nod->fr)--;
        nod->fii[s[pc]-'a']=0;
    }

    if (nod -> fr == 0 && nod -> nrcuv == 0 && nod != rad)
    {
        delete nod;
        return 1;
    }
    return 0;

}

int cauta(trie *nod, int pc)
{
    if (pc == l) return nod->nrcuv;
    return cauta(nod->fii[s[pc]-'a'], pc+1);
}

int prefix(trie *nod, int pc)
{
    if (pc == l || nod->fii[s[pc]-'a'] == 0) return pc;
    return prefix(nod->fii[s[pc]-'a'], pc+1);
}

int main()
{
    while (f >> n >> s)
    {
        // cout << n << " " << s << " " ;
        l=s.size();
        if (n == 0) adauga(rad, 0), cuvinte++;
        else if (n == 1) sterge(rad, 0), cuvinte--;
        else if (n == 2) g << cauta(rad, 0) << '\n';
        else if (n == 3)g << prefix(rad, 0) << '\n';
        // cout << '\n';
    }

    return 0;
}