Cod sursa(job #2738369)

Utilizator niculaandreiNicula Andrei Bogdan niculaandrei Data 5 aprilie 2021 19:16:09
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;

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

struct Trie
{
    Trie *next[30] = {NULL};
    int cnt = 0, cntEnd = 0;
};

int M, op;
char s[25];

Trie *root = new Trie;

void Insert(Trie *currNode, char *s)
{
    currNode->cnt++;
    if (s[0] == 0) {
        currNode->cntEnd++;
        return;
    }
    int letter = s[0] - 'a';
    if (currNode->next[letter] == NULL) {
        Trie *next = new Trie;
        currNode->next[letter] = next;
    }
    Insert(currNode->next[letter], s + 1);
}

void Delete(Trie *currNode, char *s)
{
    currNode->cnt--;
    if (s[0] == 0) {
        currNode->cntEnd--;
        return;
    }
    int letter = s[0] - 'a';
    Delete(currNode->next[letter], s + 1);
    if (currNode->next[letter]->cnt == 0) {
        Trie *node = currNode->next[letter];
        delete node;
        currNode->next[letter] = NULL;
    }
}

int Count(Trie *currNode, char *s)
{
    if (s[0] == 0) {
        return currNode->cntEnd;
    }
    int letter = s[0] - 'a';
    return Count(currNode->next[letter], s + 1);
}

string Ans;
void Prefix(Trie *currNode, char *s)
{
    if (s[0] == 0) {
        return;
    }
    int letter = s[0] - 'a';
    if (currNode->next[letter] != NULL) {
        Ans += s[0];
        Prefix(currNode->next[letter], s + 1);
    }
}

int main()
{
    while (fin >> op >> s) {
        if (op == 0) {
            Insert(root, s);
        }
        else if (op == 1) {
            Delete(root, s);
        }
        else if (op == 2) {
            fout << Count(root, s) << "\n";
        }
        else {
            Ans.clear();
            Prefix(root, s);
            fout << Ans.size() << "\n";
        }
    }
    return 0;
}