Cod sursa(job #2259782)

Utilizator GiihuoTihufiNeacsu Stefan GiihuoTihufi Data 13 octombrie 2018 19:43:12
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.45 kb
#include <bits/stdc++.h>

using namespace std;

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

const int ALPHABET_SIZE = 26;

struct TrieNode
{
    struct TrieNode *children[ALPHABET_SIZE];
    struct TrieNode *parent=NULL;
    int wcnt;
};

struct TrieNode *getNode(void)
{
    struct TrieNode *pNode =  new TrieNode;
    pNode->wcnt=0;
    for(int i=0;i<ALPHABET_SIZE;i++)
        pNode->children[i] = NULL;
    return pNode;
}

void insert(struct TrieNode *root, string key)
{
    struct TrieNode *node = root;
    for(int i=0;i<key.length();i++)
    {
        int index=key[i]-'a';
        if(!node->children[index])
            node->children[index]=getNode(),
            node->children[index]->parent=node;
        node=node->children[index];
    }
    node->wcnt++;
}

bool freeNode(struct TrieNode *root)
{
    for(int i=0;i<ALPHABET_SIZE;i++)
        if(root->children[i]) return 0;
    return 1;
}

bool erase(struct TrieNode *root, string key,int level=0)
{
    if(key.size()==0) return 0;
    if(root)
    {
        if(level==key.size())
        {
            if(root->wcnt)
            {
                root->wcnt--;
                return freeNode(root);
            }
        }
    }
    else
    {
        int index=key[level]-'a';
        if(erase(root->children[index],key,level+1))
        {
            delete root->children[index];
            return root->wcnt!=0 && freeNode(root);
        }
    }
    return 0;
}

int search(struct TrieNode *root,string key)
{
    struct TrieNode *node = root;
    for(int i=0;i<key.length();i++)
    {
        int index=key[i]-'a';
        if(!node->children[index]) return false;
        node=node->children[index];
    }
    return (node!=NULL)?node->wcnt : 0;
}

int count(struct TrieNode *root,string key)
{
    struct TrieNode *node = root;
    int result=0;
    for(int i=0;i<key.length();i++)
    {
        int index=key[i]-'a';
        if(!node->children[index]) return result;
        node=node->children[index];
        result++;
    }
    return result;
}

int main()
{
    struct TrieNode *root = getNode();
    int n; string w;
    while(f>>n>>w)
    {
        switch(n)
        {
            case 0:    insert(root,w);       break;
            case 1:    erase (root,w);       break;
            case 2: g<<search(root,w)<<'\n'; break;
            case 3: g<<count (root,w)<<'\n'; break;
        }
    }
    return 0;
}