Cod sursa(job #2578499)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 11 martie 2020 10:38:28
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

struct Trie
{
    int word, nrFii;
    Trie* fii[26];

    Trie()
    {
        word = 0;
        nrFii = 0;
        memset(fii, 0, sizeof fii);
    }
};

Trie *T = new Trie;

void add(Trie *nod, char *s)
{
    //cout << *s << '\n';

    int x = *s - 'a';

    if(*s == '\0')
    {
        nod -> word++;

        return;
    }

    if(nod -> fii[x] == nullptr)
    {
        nod -> nrFii++;

        nod -> fii[x] = new Trie;
    }

    add(nod -> fii[x], s + 1);
}

bool del(Trie *nod, char *s)
{
    int x = *s - 'a';

    if(*s == '\0')
        nod -> word--;

    else if(del(nod -> fii[x], s + 1) == true)
    {
        nod -> nrFii--;

        nod -> fii[x] = nullptr;
    }

    if(nod != T && nod -> nrFii == 0 && nod -> word == 0)
    {
        delete nod;

        return true;
    }

    return false;
}

int aparitii(Trie *nod, char *s)
{
    int x = *s - 'a';

    if(*s == '\0')
        return nod -> word;

    if(nod -> fii[x] == nullptr)
        return 0;

    return aparitii(nod -> fii[x], s + 1);
}

int prefix(Trie *nod, char *s)
{
    int x = *s - 'a';

    if(*s == '\0')
        return 0;

    if(nod -> fii[x] == nullptr)
        return 0;

    return prefix(nod -> fii[x], s + 1) + 1;
}

int main()
{
    int op;
    char s[26];

    while(in >> op >> s)
    {
        //s[strlen(s)] = '\0';

        switch(op)
        {
        case 0:
            add(T, s);
            break;

        case 1:
            del(T, s);
            break;

        case 2:
            out << aparitii(T, s) << '\n';
            break;

        case 3:
            out << prefix(T, s) << '\n';
            break;

        default:
            break;
        }

        memset(s, 0, sizeof s);
    }

    return 0;
}