Cod sursa(job #1998910)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 9 iulie 2017 16:45:38
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 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;
list <nod*> st;
string s;
string :: iterator it;
map <char,nod*> :: iterator found;
// const string
inline void add(string s)
{
    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(string s)
{
    st.clear();
    nod *sf=root;
    for(it=s.begin();it!=s.end();it++)
    {
        found=sf->son.find(*it);
        st.push_back(sf);
        sf=found->second;
    }
    sf->number_of_words--;
    it=--s.end();
    while(sf->son.empty() and it!=s.begin())
    {
        delete sf;
        sf=st.back();
        st.pop_back();
        sf->son.erase(sf->son.find(*it));
        it--;
    }
}
inline int number_of_aparances(string s)
{
    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(string s)
{
    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;
    while(f>>op>>s)
        switch (op)
        {
            case 0:
                add(s);
            break;

            case 1:
                del(s);
            break;

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

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

    return 0;
}