Cod sursa(job #2450436)

Utilizator valorosu_300Cristian Gherman valorosu_300 Data 23 august 2019 12:43:35
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.44 kb
#include <fstream>
using namespace std;

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

const int DICT_SIZE = 26; ///dictionary size
const int MAX_LEN = 22;

class Trie{
    private:
        int cnt; ///cate cuv au ajuns aici
        int nrFii; ///cati fii are nodul crt
        bool isRoot;
        Trie *fiu[DICT_SIZE];

    public:
        Trie(bool root){
            cnt = nrFii = 0;
            for(int i=0;i<DICT_SIZE;i++)
                fiu[i] = NULL;
            isRoot = root;
        }

        void insertWord(Trie *node, char word[]){
            if(word[0] == NULL){
                node->cnt ++;
                return;
            }
            int let = word[0] - 'a'; ///crt letter

            ///'open' a new path
            if(node->fiu[let] == NULL){
                node->fiu[let] = new Trie(false);
                node->nrFii ++;
            }

            ///recur for the next letter
            insertWord(node->fiu[let], word + 1);
        }

        bool deleteWord(Trie *node, char word[]){
            int let = word[0] - 'a';

            if(word[0] == NULL)
                node->cnt --;

            else if(deleteWord(node->fiu[let], word + 1) == true){
                node->fiu[let] = NULL;
                node->nrFii --;
            }

            if(node->cnt == 0 && node->nrFii == 0 && node->isRoot == false){
                delete node;
                return true;
            }

            return false;
        }

        int getCount(Trie *node, char word[]){
            if(word[0] == NULL)
                return node->cnt;

            int let = word[0] - 'a';

            if(node->fiu[let])
                return getCount(node->fiu[let], word + 1);
            return 0;
        }

        int getPrefix(Trie *node, char word[], int len){
            int let = word[0] - 'a';

            if(node->fiu[let] == NULL || word[0] == NULL)
                return len;
            return getPrefix(node->fiu[let], word + 1, len + 1);
        }
};

Trie *T = new Trie(true);

int main()
{
    int q;
    char cuv[MAX_LEN];

    while(in>>q>>cuv){
        if(q == 0)
            T->insertWord(T, cuv);
        else if(q == 1)
            T->deleteWord(T, cuv);
        else if(q == 2)
            out<<T->getCount(T, cuv)<<"\n";
        else
            out<<T->getPrefix(T, cuv, 0)<<"\n";
    }

    in.close();
    out.close();
    return 0;
}