Cod sursa(job #2150718)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 3 martie 2018 18:50:21
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.46 kb
#include <bits/stdc++.h>
#define SIGMA 27
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct TrieNode
{
    TrieNode *children[SIGMA];
    int nr_words,nr_children;
    TrieNode()
    {
        nr_words=0;
        nr_children=0;
        memset(children,NULL,sizeof(children));
    }
};
string s;
string :: iterator it;
#define FOR for(it=s.begin();it!=s.end();++it)
TrieNode *st[SIGMA];
TrieNode *root=new TrieNode;
int top;
void insert_trie()
{
    TrieNode *current_node=root;
    FOR
    {
        if(current_node->children[*it-'a'])
            current_node=current_node->children[*it-'a'];
        else
        {
            TrieNode *p=new TrieNode;
            current_node->children[*it-'a']=p;
            current_node->nr_children++;
            current_node=p;
        }
    }
    current_node->nr_words++;
}
void delete_trie()
{
    top=0;
    TrieNode *current_node=root;
    FOR
    {
        st[++top]=current_node;
        current_node=current_node->children[*it-'a'];
    }
    it=s.end();
    --it;
    current_node->nr_words--;
    while(!(current_node->nr_words) and !(current_node->nr_children))
    {
        delete current_node;
        current_node=st[top--];
        current_node->children[*it-'a']=NULL;
        current_node->nr_children--;
        --it;
    }
}
int nr_appearances()
{
    TrieNode *current_node=root;
    FOR
    {
        if(!current_node->children[*it-'a']) return 0;
        current_node=current_node->children[*it-'a'];
    }
    return current_node->nr_words;
}
int nr_prefixes()
{
    int ans=0;
    TrieNode *current_node=root;
    FOR
    {
        if(!current_node->children[*it-'a']) return ans;
        ans++;
        current_node=current_node->children[*it-'a'];
    }
    return ans;
}
int main()
{
    int op;
    root->nr_children=1;
    while(f>>op>>s)
    {
        switch (op)
        {
            case 0:
                {
                    insert_trie();
                    break;
                }
            case 1:
                {
                    delete_trie();
                    break;
                }
            case 2:
                {
                    g<<nr_appearances()<<'\n';
                    break;
                }
            case 3:
                {
                    g<<nr_prefixes()<<'\n';
                    break;
                }
        }
    }

    return 0;
}