Cod sursa(job #1004755)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 3 octombrie 2013 17:01:25
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <fstream>

#include <cstring>
using namespace std;

const int SIGMA = 26;
const int MAX_L = 25;

struct Trie {
    int freq, words;
    Trie *sons[SIGMA];

    Trie() {
        for(int i = 0; i < SIGMA; ++i)
            sons[i] = NULL;
        words = freq = 0;
    }
};

int t;
char S[MAX_L];
Trie *root = new Trie;

inline void insert(Trie *node, char S[]) {
    int len = strlen(S);

    if(S[len-1] == '\n')
        --len;
    for(int i = 0; i < len; ++i) {
        int next = S[i] - 'a';
        if(node->sons[next] == NULL)
            node->sons[next] = new Trie;
        node = node->sons[next];
        ++node->words;
    }

    ++node->freq;
}

inline void erase(Trie *node, char S[]) {
    int len = strlen(S);

    if(S[len-1] == '\n')
        --len;
    for(int i = 0; i < len; ++i) {
        int next = S[i] - 'a';
        if(node->sons[next] == NULL)
            node->sons[next] = new Trie;
        node = node->sons[next];
        --node->words;
    }

    --node->freq;
}

inline int search(Trie *node, char S[]) {
    int len = strlen(S);

    if(S[len-1] == '\n')
        --len;
    for(int i = 0; i < len; ++i) {
        int next = S[i] - 'a';
        if(node->sons[next] == NULL)
            node->sons[next] = new Trie;
        node = node->sons[next];
    }

    return node->freq;
}

inline int prefix(Trie *node, char S[]) {
    int len = strlen(S), ans = 0;

    if(S[len-1] == '\n')
        --len;
    for(int i = 0; i < len; ++i) {
        int next = S[i] - 'a';
        if(node->sons[next] && (node->sons[next])->words != 0) {
            node = node->sons[next];
            ++ans;
        }
        else i = len;
    }

    return ans;
}

int main() {
    ifstream f("trie.in");
    ofstream g("trie.out");

    while((f >> t >> S)) {
        if(t == 0)
            insert(root, S);
        else if(t == 1)
            erase(root, S);
        else if(t == 2)
            g << search(root, S) << "\n";
        else g << prefix(root, S) << "\n";
    }

    f.close();
    g.close();

    return 0;
}