Cod sursa(job #2150580)

Utilizator DawlauAndrei Blahovici Dawlau Data 3 martie 2018 17:26:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include<fstream>
#include<string>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int ALPHSZ = 26;

struct trie{

    trie* lettersList[ALPHSZ] = {0};
    int wordFreq = 0, hashSize = 0;
};

inline int hashedChar(char a){

    return a - 'a';
}

trie* root = new trie;

void insertWord(trie* node, char* word){

    if(*word == '\0')
        ++(node -> wordFreq);
    else if(node -> lettersList[hashedChar(*word)])
        insertWord(node -> lettersList[hashedChar(*word)], word + 1);
    else{

        trie* newNode = new trie;
        node -> lettersList[hashedChar(*word)] = newNode;
        ++(node -> hashSize);
        insertWord(node -> lettersList[hashedChar(*word)], word + 1);
    }
}

bool deleteWord(trie* node, char* word){

    if(*word == '\0')
        --(node -> wordFreq);
    else if(deleteWord(node -> lettersList[hashedChar(*word)], word + 1)){

        node -> lettersList[hashedChar(*word)] = 0;
        --(node -> hashSize);
    }

    if(node -> wordFreq == 0 and node != root and node -> hashSize == 0){

        delete node;
        return true;
    }
    return false;
}

int wordFrequency(trie* node, char* word){

    if(*word == '\0')
        return node -> wordFreq;

    if(node -> lettersList[hashedChar(*word)])
        return wordFrequency(node -> lettersList[hashedChar(*word)], word + 1);
    else
        return 0;
}

int longestPrefix(trie* node, char* word){

    if(*word == '\0')
        return 0;

    if(node -> lettersList[hashedChar(*word)])
        return 1 + longestPrefix(node -> lettersList[hashedChar(*word)], word + 1);
    else
        return 0;
}

int main(){

    int code;
    char word[ALPHSZ];

    while(fin >> code >> word){

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