Cod sursa(job #424561)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 24 martie 2010 22:21:47
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");

struct Trie
{
    int nr, pref;
    Trie *fii[26], *tata;
    Trie()
    {
        nr = pref = 0;
    }
};

Trie *t, *it, *it2, *to_delete[1000];
int n, op, val, i, l, len;
char s[22],*p;

int main()
{
    t = new Trie();
    while(in>>op>>s)
    {
        p = s;
        it = t;
        l = 0;len=0;
        while(p[0] != '\0')
        {
            if(it->fii[p[0] - 'a'] == NULL && op == 3)
                break;
            if(it->fii[p[0] - 'a'] == NULL)
                it->fii[p[0] - 'a'] = new Trie(), it->fii[p[0] - 'a']->tata = it,
                        it = it->fii[p[0] - 'a'];
            else
                it = it->fii[p[0] - 'a'];
            if(op == 0)
                ++ it->pref;
            else if(op == 1 && it->pref > 0)
                -- it->pref;
            else if(op == 3 && it->pref > 0)
                l = p-s+1;


            p++;
        }
        if(op == 0)
            it->nr ++;
        else if(op == 1 && it->nr > 0)
        {
            it->nr --;
            l = 0;
            while(it->pref == 0 && it != t)
            {
                it2 = it->tata;       
                for(i=0; i<30; i++)
                    if(it2->fii[i] == it)
                        {it2->fii[i] = NULL; break;}
                to_delete[++l] = it;
                it = it2;
            }
            while(l)
            {
                delete to_delete[l--];
            }

        }
        else if(op == 2)
            out<<it->nr<<'\n';
        else if(op == 3)
            out<<l<<'\n';

    }
    return 0;
}