Cod sursa(job #2426265)

Utilizator PushkinPetolea Cosmin Pushkin Data 27 mai 2019 09:42:57
Problema Trie Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.54 kb
#include <bits/stdc++.h>
using namespace std;
#define ALPHABET_SIZE 26
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
    struct nod* v[ALPHABET_SIZE];
    unsigned int ap=0;
    bool fr;
    nod()
    {
        fr = false;
        for (unsigned int i = 0; i < ALPHABET_SIZE; i++)
        v[i] = NULL;
    }
    bool empty()
    {
        for (unsigned int i = 0; i < ALPHABET_SIZE; i++)
            if (v[i])
                return false;
        return true;
    }
    void insert(string key)
    {
        nod* pCrawl = this;
        for (unsigned int i = 0; i < key.length(); i++)
        {
            unsigned int index = key[i] - 'a';
            if (!pCrawl->v[index])
                pCrawl->v[index] = new nod();
            pCrawl = pCrawl->v[index];
        }
        pCrawl->fr = true;
        pCrawl->ap++;
    }
    unsigned int search(string key)
    {
        nod* pCrawl = this;
        for (unsigned int i = 0; i < key.length(); i++)
        {
            unsigned int index = key[i] - 'a';
            if (!pCrawl->v[index])
                return false;

            pCrawl = pCrawl->v[index];
        }
        return int(pCrawl != NULL && pCrawl->fr)*pCrawl->ap;
    }
    nod* remove(nod* r, string s, unsigned int depth = 0)
    {
        if (!r)
            return NULL;
        if (depth == s.size())
        {
            if(r->ap>1)
            {
                r->ap--;
                return r;
            }
            if (r->fr)
                r->fr = false;
            if (r->empty())
            {
                delete (r);
                r = NULL;
            }
            return r;
        }
        unsigned int index = s[depth] - 'a';
        r->v[index] = remove(r->v[index], s, depth + 1);
        if (r->empty() && r->fr == false)
        {
            delete (r);
            r = NULL;
        }
        return r;
    }
    nod* remove(string s)
    {
        return remove(this, s);
    }
};
nod* r = new nod();
int main()
{
    int x;
    string s;
    while(f>>x>>s)
        switch(x)
    {
        case 0:r->insert(s);break;
        case 1:r->remove(s);break;
        case 2:g<<r->search(s)<<'\n';break;
        case 3:
            {
                nod* p=r;
                int i=0;
                while(p->v[s[i]-'a'])
                {
                    p=p->v[s[i]-'a'];
                    i++;
                }
                g<<i<<'\n';
            }break;
    }
    f.close();
    g.close();
    return 0;
}