Cod sursa(job #754897)

Utilizator BitOneSAlexandru BitOne Data 3 iunie 2012 22:28:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <string>
#include <fstream>
#include <cstdlib>

using namespace std;
typedef string::const_iterator sit;

class Trie {
    int countAp, countSet;
    bool isRoot;
    Trie *v[31];

    bool Del(sit it, sit iend)
    {
        if(it >= iend)
        {
            --countAp;
            return 0 == countAp && 0 == countSet;
        }
        int idx=*it - 'a';

        if(NULL == v[idx])
            throw "String given isn't in trie";
        if(true == v[idx]->Del(it+1, iend))
        {
            delete v[idx];
            v[idx]=NULL;
            --countSet;
        }
        if(!isRoot && 0 == countSet + countAp)
            return true;
        return false;
    }

public :
    Trie() : countAp(0), countSet(0), isRoot(true)
    {
        for(int i=0; i < 31; ++i)
            v[i]=NULL;
    }
    void Add(sit it, sit iend)
    {
        if(it >= iend)
           ++countAp;
        else {
                int idx=*it - 'a';

                if(NULL == v[idx])
                    v[idx]=new Trie(), ++countSet;
                v[idx]->isRoot=false;
                v[idx]->Add(it+1, iend);
             }
    }
    int CountAp(sit it, sit iend)
    {
        if(it >= iend)
            return countAp;
        int idx=*it - 'a';

        if(NULL == v[idx])
            return 0;
        return v[idx]->CountAp(it+1, iend);
    }
    void Delete(sit it, sit iend) {Del(it, iend);}
    int LCP(sit it, sit iend)
    {
        if(it >= iend)
            return 0;
        int idx=*it - 'a';

        if(NULL == v[idx])
            return 0;

        return 1+v[idx]->LCP(it+1, iend);
    }
} root;
int main()
{
    int op;
    string s;
    ifstream in("trie.in");
    ofstream out("trie.out");

    while(in>>op>>s)
    {
        switch(op)
        {
            case 0: root.Add(s.begin(), s.end());                break;
            case 1: root.Delete(s.begin(), s.end());             break;
            case 2: out<<root.CountAp(s.begin(), s.end())<<'\n'; break;
            case 3: out<<root.LCP(s.begin(), s.end())<<'\n';
        }
    }

    return EXIT_SUCCESS;
}