Cod sursa(job #2006317)

Utilizator savigunFeleaga Dragos-George savigun Data 29 iulie 2017 14:14:30
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

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

struct Node {
    int words;
    int prefixes;
    Node* children[26];

    Node() {
        words = 0;
        prefixes = 0;
        for (int i = 0; i < 26; ++i) children[i] = nullptr;
    }
};

Node* root;

void addWord(Node* v, string& w) {
    int c = w[0] - 'a';
    if (v -> children[c] == nullptr) v -> children[c] = new Node();
    v -> children[c] -> prefixes++;
    w.erase(w.begin());
    if (w.size() == 0) {
        v -> children[c] -> words++;
    } else {
        addWord(v -> children[c], w);
    }
}

int countWords(Node* v, string& w) {
    if (w.size() == 0) return v -> words;
    int c = w[0] - 'a';
    if (v -> children[c] == nullptr) return 0;
    w.erase(w.begin());
    return countWords(v -> children[c], w);
}

void deleteWord(Node* v, string& w) {
    if (w.size() == 0) {
        v -> words--;
        v -> prefixes--;
    } else {
        int c = w[0] - 'a';
        v -> prefixes--;
        w.erase(w.begin());
        deleteWord(v -> children[c], w);
    }

    if (v -> prefixes == 0 && v != root) {
        v = nullptr;
        delete v;
    }
}

int longestPrefix(Node* v, string &w, int k) {
    while (w.size() >= 0 && v != nullptr) {
        if (v -> prefixes > 0) k++;
        int c = w[0] - 'a';
        v = v -> children[c];
        if (w.size() > 0) w.erase(w.begin()); else break;
    }
    return k;
}


int main()
{
    root = new Node();
    int o;
    string w;

    while (in >> o) {
        in >> w;
        switch(o) {
            case 0: addWord(root, w); break;
            case 1: deleteWord(root, w); break;
            case 2: out << countWords(root, w) << '\n'; break;
            case 3: out << longestPrefix(root, w, 0) << '\n'; break;
        }
    }

    return 0;
}