Cod sursa(job #2325825)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 22 ianuarie 2019 22:45:23
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>

using namespace std;

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

int n, type;

char word[30];

struct node{
    int freq;
    int wordEnd;
    node *letters[26];
    node(){
        for(int i = 0; i < 26; ++ i)
            letters[i] = NULL;
        freq = 0;
        wordEnd = 0;
    }
};
node* root;

void addWord(node* nodeCurr, char* c){
    ++ nodeCurr -> freq;
    if(*c == 0){
        ++ nodeCurr -> wordEnd;
        return;
    }
    if(nodeCurr -> letters[*c - 'a'] == NULL){
        nodeCurr -> letters[*c - 'a'] = new node;
    }
    addWord(nodeCurr -> letters[*c - 'a'], c + 1);
}

void deleteWord(node* nodeCurr, char* c){
    -- nodeCurr -> freq;
    if(*c == 0){
        -- nodeCurr -> wordEnd;
    }
    if(*c != 0 && nodeCurr -> letters[*c - 'a'] != NULL){
        deleteWord(nodeCurr -> letters[*c - 'a'], c + 1);
        if(nodeCurr -> letters[*c - 'a'] -> freq == 0){
            delete nodeCurr -> letters[*c - 'a'];
            nodeCurr -> letters[*c - 'a'] = NULL;
        }
    }
    
}

int cntFreq(node* nodeCurr, char* c){
    if(*c != 0 && nodeCurr -> letters[*c - 'a'] != NULL)
        return cntFreq(nodeCurr -> letters[*c - 'a'], c + 1);
    if(*c == 0)
        return nodeCurr -> wordEnd;
    return 0;
}

int cntLength(node* nodeCurr, char* c){
    if(*c != 0 && nodeCurr -> letters[*c - 'a'] != NULL)
        return 1 + cntLength(nodeCurr -> letters[*c - 'a'], c + 1);
    return 0;
}

int main(int argc, const char * argv[]) {
    
    root = new node;
    while(in>>type){
        in>>word;
        switch (type) {
            case 0:
                addWord(root, word);
                break;
            case 1:
                deleteWord(root, word);
                break;
            case 2:
                out<<cntFreq(root, word)<<'\n';
                break;
            case 3:
                out<<cntLength(root, word)<<'\n';
                break;
        }
    }
    return 0;
}