Cod sursa(job #2530506)

Utilizator Vlad.Vlad Cristian Vlad. Data 24 ianuarie 2020 21:26:59
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Node{
    int sonCount, cnt;
    Node* sons[26];
};
Node* root;
void addWord(Node* node, char* word) {
    char c = *word;
    if (c == '\0') {
        ++node -> cnt;
        return;
    }
    int i = c - 'a';
    if (node -> sons[i] == nullptr) {
        ++node -> sonCount;
        node -> sons[i] = new Node;
    }
    addWord(node -> sons[i], word + 1);
}
bool deleteWord(Node* node, char* word) {
    char c = *word;
    int i = c - 'a';
    if (c == '\0') {
        --node -> cnt;
    }
    else if (deleteWord(node -> sons[i], word + 1)) {
        --node -> sonCount;
        node -> sons[i] = nullptr;
    }
    if (node != root && node -> sonCount == 0 && node -> cnt == 0) {
        delete node;
        return true;
    }
    return false;
}
int getCount(Node* node, char* word) {
    char c = *word;
    if (c == '\0') {
        return node -> cnt;
    }
    if (node -> cnt == 0 && node -> sonCount == 0) {
        return 0;
    }
    return getCount(node -> sons[c - 'a'], word + 1);
}
int getLenghtOfLongestPrefix(Node* node, char* prefix) {
    char c = *prefix;
    int i = c - 'a';
    if (c == '\0' || node -> sons[i] == nullptr) {
        return 0;
    }
    return getLenghtOfLongestPrefix(node -> sons[i], prefix + 1) + 1;
}
int main()
{
    root = new Node;
    int t;
    char w[25];
    while (fin >> t >> w) {
        if (t == 0) {
            addWord(root, w);
        }
        else if (t == 1) {
            deleteWord(root, w);
        }
        else if (t == 2) {
            fout << getCount(root, w) << "\n";
        }
        else {
            fout << getLenghtOfLongestPrefix(root, w) << "\n";
        }
    }
    return 0;
}