Cod sursa(job #2682496)

Utilizator xtreme77Patrick Sava xtreme77 Data 8 decembrie 2020 19:56:19
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.45 kb
#include <cstring>
#include <fstream>

using namespace std;

// Questions:
// (*currentNode).count <=> currentNode->count

const int ALPHA = 26;

struct TrieNode {
    int count;
    int leaf;
    TrieNode *next[ALPHA];
    TrieNode() : count(0), leaf(0) {
        memset(next, 0, sizeof(next));
    }
};

void insert(TrieNode *& currentNode, int currentIndex, const string& currentSeq) {
    currentNode -> count += 1;
    if (currentIndex == currentSeq.size()) {
        currentNode -> leaf += 1;
        return;
    }
    auto nextChar = currentSeq[currentIndex] - 'a';
    if (currentNode->next[nextChar] == nullptr) {
        currentNode->next[nextChar] = new TrieNode();
    }
    insert(currentNode->next[nextChar], currentIndex + 1, currentSeq);
}

void erase(TrieNode*& currentNode, int currentIndex, const string& currentSeq) {
    currentNode -> count -= 1;
    if (currentIndex == currentSeq.size()) {
        currentNode -> leaf -= 1;
        return;
    }
    auto nextChar = currentSeq[currentIndex] - 'a';
    erase(currentNode->next[nextChar], currentIndex + 1, currentSeq);
    if (currentNode->next[nextChar] -> count == 0) {
        delete currentNode->next[nextChar];
        currentNode->next[nextChar] = nullptr;
    }
}

int count(const TrieNode *currentNode, int currentIndex, const string& currentSeq) {
    if (currentIndex == currentSeq.size()) {
        return currentNode->leaf;
    }
    auto nextChar = currentSeq[currentIndex] - 'a';
    if (currentNode->next[nextChar])
        return count(currentNode->next[nextChar], currentIndex + 1, currentSeq);
    return 0;
}

int lcp(const TrieNode *currentNode, int currentIndex, const string& currentSeq) {
    if (currentNode == nullptr or currentIndex == currentSeq.size()) {
        return currentIndex - (currentNode == nullptr);
    }
    auto nextChar = currentSeq[currentIndex] - 'a';
    return lcp(currentNode->next[nextChar], currentIndex + 1, currentSeq);
}

int main() {
    ifstream cin ("trie.in");
    ofstream cout ("trie.out");
    int type;
    string word;
    auto* Root = new TrieNode();
    while (cin >> type >> word) {
        switch (type) {
            case 0:
                insert(Root, 0, word);
                break;
            case 1:
                erase(Root, 0, word);
                break;
            case 2:
                cout << count(Root, 0, word) << '\n';
                break;
            default:
                cout << lcp(Root, 0, word) << '\n';
        }
    }
    return 0;
}