Cod sursa(job #2149463)

Utilizator DawlauAndrei Blahovici Dawlau Data 2 martie 2018 17:31:28
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.78 kb
#include<fstream>
#include<unordered_map>
#include<cstring>
#include<stack>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie{

    unordered_map<char, trie*> lettersList;
    int wordFreq = 0;
};

trie* root = new trie;

inline void insertWord(char word[]){

    unordered_map<char, trie*> :: iterator letterPos;
    int wordLen = strlen(word), idx;

    trie* node = root;

    for(idx = 0; idx < wordLen; ++idx){

        letterPos = (node -> lettersList).find(word[idx]);
        if(letterPos == (node -> lettersList).end()){

            trie* newNode = new trie;

            (node -> lettersList).insert({word[idx], newNode});
            node = newNode;
        }
        else
            node = letterPos -> second;
    }
    ++(node -> wordFreq);
}

inline void deleteWord(char word[]){

    stack<trie*> Stack;
    trie* node = root;
    int wordLen = strlen(word), idx;
    unordered_map<char, trie*> :: iterator letterPos;

    for(idx = 0; idx < wordLen; ++idx){

        Stack.push(node);
        letterPos = (node -> lettersList).find(word[idx]);
        node = letterPos -> second;
    }
    --(node -> wordFreq);

    for(idx = wordLen - 1; node -> wordFreq == 0 and (node -> lettersList).empty() and idx >= 0; --idx){

        delete node;
        node = Stack.top();
        Stack.top();
        (node -> lettersList).erase((node -> lettersList).find(word[idx]));
    }
}

inline int wordFrequency(char word[]){

    int idx, wordLen = strlen(word);
    trie* node = root;

    unordered_map<char, trie*> :: iterator letterPos;

    for(idx = 0; idx < wordLen; ++idx){

        letterPos = (node -> lettersList).find(word[idx]);
        if(letterPos == (node -> lettersList).end())
            return 0;
        else
            node = letterPos -> second;
    }
    return (node -> wordFreq);
}

inline int get_prefixLen(char word[]){

    int prefixLen = 0, wordLen = strlen(word), idx;
    trie* node = root;

    unordered_map<char, trie*> :: iterator letterPos;

    for(idx = 0; idx < wordLen; ++idx){

        letterPos = (node -> lettersList).find(word[idx]);

        if(letterPos == (node -> lettersList).end())
            return prefixLen;
        else{
            ++prefixLen;
            node = letterPos -> second;
        }
    }
    return prefixLen;
}

int main(){

    int code;
    char word[25];

    (root -> lettersList).insert({'>', NULL});

    while(fin >> code >> word){

        if(code == 0)
            insertWord(word);
//        else if(code == 1)
//            deleteWord(word);
        else if(code == 2)
            fout << wordFrequency(word) << '\n';
        else if(code == 3)
            fout << get_prefixLen(word) << '\n';
    }
}