Cod sursa(job #2325770)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 22 ianuarie 2019 21:53:14
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 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){
    if(nodeCurr -> letters[*c - 'a'] == NULL){
        nodeCurr -> letters[*c - 'a'] = new node;
    }
    ++ nodeCurr -> freq;
    if(*c == 0)
        ++ nodeCurr -> wordEnd;
    if(*c != 0)
        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, int lg){
    if(nodeCurr -> freq < 2)
        return lg;
    if(*c != 0 && nodeCurr -> letters[*c - 'a'] != NULL)
        return cntLength(nodeCurr -> letters[*c - 'a'], c + 1, lg + 1);
    return lg;
}

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, 0)<<'\n';
                break;
        }
    }
    return 0;
}