Cod sursa(job #2006333)

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

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

#define c (w[pos] - 'a')
#define r (root -> children[w[0] - 'a'])

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

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

Node* root;

void addWord(Node* v, string& w, int pos) {
    v -> prefixes++;

    if (pos == w.size() - 1) {
        v -> words++;
        return;
    }

    pos++;
    if (v -> children[c] == nullptr) v -> children[c] = new Node();
    addWord(v -> children[c], w, pos);
}

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

void deleteWord(Node* v, string& w, int pos) {
    if (pos == w.size() - 1) {
        v -> words--;
        v -> prefixes--;
    } else {
        v -> prefixes--;
        pos++;
        deleteWord(v -> children[c], w, pos);
    }

    if (v -> prefixes == 0) {
        //v = nullptr;
        delete v;
    }
}

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


int main()
{
    root = new Node();
    for (int i = 0; i < 26; ++i) root -> children[i] = new Node();
    int o;
    string w;

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

    return 0;
}