Cod sursa(job #2461677)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 25 septembrie 2019 22:29:41
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 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;
    else if (nod->fii[s[pc]-'a'] != 0)
    return cauta(nod->fii[s[pc]-'a'], pc+1);
    return 0;
}

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()
{
    s.resize(30);
    while (f >> n >> s)
    {
        // cout << n << " " << s << " " ;
        l=s.size();
        if (n == 0) adauga(rad, 0);
        else if (n == 1) sterge(rad, 0);
        else if (n == 2) g << cauta(rad, 0) << '\n';
        else if (n == 3)g << prefix(rad, 0) << '\n';
        // cout << '\n';
    }

    return 0;
}