Cod sursa(job #2006536)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 30 iulie 2017 14:34:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
    map <char,nod*> son;
    int number_of_words;
};
nod *root=new nod;
nod *st[25];
int num;
int top;
string s;
string :: iterator it;
map <char,nod*> :: iterator found;
inline void add()
{
    nod *sf=root,*p;
    for(it=s.begin();it!=s.end();it++)
    {
        found=sf->son.find(*it);
        if(found!=sf->son.end())
        {
            sf=found->second;
        }
        else
        {
            p=new nod;
            p->number_of_words=0;
            sf->son.insert(pair <char,nod*>(*it,p));
            sf=p;
        }
    }
    sf->number_of_words++;
}
inline void del()
{
    nod *sf=root;
    top=0;
    for(it=s.begin();it!=s.end();it++)
    {
        found=sf->son.find(*it);
        st[++top]=sf;
        sf=found->second;
    }
    it=s.end();
    --it;
    sf->number_of_words--;
    while(!(sf->number_of_words) and sf->son.empty())
    {
        delete sf;
        sf=st[top--];
        sf->son.erase(sf->son.find(*it));
        it--;
    }
}
inline int number_of_aparances()
{
    nod *sf=root;
    for(it=s.begin();it!=s.end();it++)
    {
        found=sf->son.find(*it);
        if(found==sf->son.end()) return 0;
        else sf=found->second;
    }
    return sf->number_of_words;
}
inline int number_of_prefixes()
{
    int nr=0;
    nod *sf=root;
    for(it=s.begin();it!=s.end();it++)
    {
        found=sf->son.find(*it);
        if(found==sf->son.end())
            return nr;
        else
        {
            sf=found->second;
            nr++;
        }
    }
    return nr;
}
int main()
{
    int op;
    root->son.insert(pair <char,nod*> ('1',NULL));
    while(f>>op)
    {
        f>>s;
        ++num;
        switch (op)
        {
            case 0:
                add();
            break;

            case 1:
                del();
            break;

            case 2:
                g<<number_of_aparances()<<'\n';
            break;

            case 3:
                g<<number_of_prefixes()<<'\n';
            break;
        }
    }

    return 0;
}