Cod sursa(job #2415616)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 26 aprilie 2019 12:39:04
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int SIGMA = 27;

struct Node
{
    int nrap;
    int nrc;
    Node* fii[SIGMA];

    Node()
    {
        nrap = nrc = 0;
        memset(fii, NULL, sizeof(fii));
    }
};

Node* InsertTrie(Node* node, char s[])
{
    if(node == NULL)
        node = new Node;

    node-> nrap++;

    if(s[0] == '\0')
        node-> nrc++;
    else
        node-> fii[s[0] - 'a'] = InsertTrie(node-> fii[s[0] - 'a'], s + 1);

    return node;
}

Node *DeleteTrie(Node* node, char s[])
{
    if(s[0] == '\0')
        node-> nrc--;

    node-> nrap--;
    if(node-> nrap == 0)
        node = NULL;

    if(s[0] != '\0')
        node-> fii[s[0] - 'a'] = DeleteTrie(node-> fii[s[0] - 'a'], s + 1);

    return node;
}

int ApTrie(Node* node, char s[])
{
    if(s[0] == '\0')
        return node-> nrc;

    return ApTrie(node-> fii[s[0] - 'a'], s + 1);
}

int bestPref(Node *node, char s[])
{
    if(node == NULL)
        return -1;

    if(s[0] == '\0')
        return 0;

    return 1 + bestPref(node-> fii[s[0] - 'a'], s + 1);
}

Node* trie;
int op;
char s[25];

int main()
{
    while(fin >> op >> s)
    {
        if(op == 0)
            trie = InsertTrie(trie, s);
        else if(op == 1)
            trie = DeleteTrie(trie, s);
        else if(op == 2)
            fout << ApTrie(trie, s) << '\n';
        else
            fout << bestPref(trie, s) << '\n';
    }

    return 0;
}