Cod sursa(job #1314275)

Utilizator george_stelianChichirim George george_stelian Data 11 ianuarie 2015 18:19:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include <cstdio>
#include <cstring>
#include <map>

using namespace std;

class trie
{
    public:
        void insert(char cuv[20])
        {
            node *nod=rad;
            int lim=strlen(cuv);
            for(int i=0;i<lim;i++)
            {
                nod->nr++;
                if(nod->fiu.count(cuv[i])==0)
                    nod->fiu[cuv[i]]=new node();
                nod=nod->fiu[cuv[i]];
            }
            nod->nr++;
            nod->nrterm++;
        }

        void erase(char cuv[20])
        {
            erase(rad,cuv,0);
        }

        int count(char cuv[20])
        {
            node *nod=rad;
            int lim=strlen(cuv);
            for(int i=0;i<lim;i++)
            {
                if(nod->fiu.count(cuv[i])==0) return 0;
                nod=nod->fiu[cuv[i]];
            }
            return nod->nrterm;
        }

        int prefix(char cuv[20])
        {
            node *nod=rad;
            int lim=strlen(cuv),i=0;
            for(;i<lim;i++)
            {
                if(nod->fiu.count(cuv[i])==0) break;
                nod=nod->fiu[cuv[i]];
            }
            return i;
        }

    private:
        class node
        {
            public:
                int nr,nrterm;
                map<char,node*> fiu;
                node():
                    nr(0),
                    nrterm(0),
                    fiu(map<char,node*>()) {}
        };
        node *rad=new node();

        void erase(node *nod,char cuv[20],int i)
        {
            nod->nr--;
            if(i==strlen(cuv))
            {
                nod->nrterm--;
                return;
            }
            erase(nod->fiu[cuv[i]],cuv,i+1);
            if(nod->fiu[cuv[i]]->nr==0)
            {
                delete nod->fiu[cuv[i]];
                nod->fiu.erase(nod->fiu.find(cuv[i]));
            }
        }
};

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    int tip;
    char cuv[20];
    trie v;
    while(!feof(stdin))
    {
        scanf("%d %s\n",&tip,cuv);
        if(tip==0) v.insert(cuv);
        else if(tip==1) v.erase(cuv);
        else if(tip==2) printf("%d\n", v.count(cuv));
        else printf("%d\n",v.prefix(cuv));
    }
    return 0;
}