Cod sursa(job #809772)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 9 noiembrie 2012 00:02:05
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <cstring>

using namespace std;

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

inline int maxim(int a,int b){if(a>b)return a;return b;}

struct trie
{
    int cont,nrfii;
    trie *fiu[27];
    trie()
    {
        cont = nrfii = 0;
        for(int i=0;i<27;i++)
            fiu[i] = NULL;
    }
} *Trie;

void Insert(trie *Root,char cuv[],int p)
{
    if(p == strlen(cuv))
    {
        Root->cont++ ;
        return;
    }
    if(Root->fiu[ cuv[p] - 'a' ] == NULL)
        Root->fiu[ cuv[p] - 'a' ] = new trie,Root->nrfii ++;
    Insert(Root->fiu[ cuv[p] - 'a'], cuv, p+1);
}

int Query(trie *Root,char cuv[], int p)
{
    if(Root==NULL)return 0;
    if(p==strlen(cuv))
    {
        return Root->cont;
    }
    return Query(Root->fiu[ cuv[p] - 'a' ],cuv, p+1);
}

bool Erase(trie *Root, char cuv[], int p)
{
    if(p == strlen(cuv))
        Root->cont-- ;

    else if(Erase(Root->fiu[ cuv[p] - 'a' ],cuv,p+1))
            Root->fiu[ cuv[p] - 'a' ] = NULL, Root->nrfii--;
    if(!Root->cont && !Root->nrfii)
    {
        delete Root;
        return 1;
    }
    return 0;
}

int Prefix(trie *Root, char cuv[], int p)
{
    if(p == strlen(cuv) || Root->fiu[ cuv[p] - 'a'] == NULL )
        return p;
    else return Prefix(Root->fiu[ cuv[p] - 'a'],cuv,p+1);
}
int main()
{
    int op;
    char cuvant[24];
    Trie = new trie;
    while(in>>op>>cuvant)
    {
        if(op == 0)
            Insert(Trie,cuvant,0);
        if(op == 1)
            Erase(Trie,cuvant,0);
        if(op ==2)
            out<<Query(Trie,cuvant,0)<<'\n';
        if(op == 3)
            out<<Prefix(Trie,cuvant,0)<<'\n';
    }
    return 0;
}