Cod sursa(job #2006296)

Utilizator savigunFeleaga Dragos-George savigun Data 29 iulie 2017 13:13:40
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 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) {
    if (w.size() == 0) {
        v -> words++;
        v -> prefixes++;
    } else {
        int c = w[0] - 'a';
        if (v -> children[c] == nullptr) v -> children[c] = new Node();
        v -> prefixes++;
        w.erase(w.begin(), w.begin() + 1);
        addWord(v -> children[c], w);
    }
}

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

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

int longestPrefix(Node* v, string &w, int k) {
    int c = w[0] - 'a';
    if (v -> prefixes > 1) {
        w.erase(w.begin(), w.begin() + 1);
        return longestPrefix(v -> children[c], w, k + 1);
    }
    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;
}