Cod sursa(job #1022287)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 5 noiembrie 2013 01:41:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <cstdio>
#include <cstring>


using namespace std;


struct trie{

        int nr, desc;
        trie *urm[26];
        trie(){
            nr = desc = 0;
            memset(urm, NULL, sizeof(urm));
            }
        };

trie *p = new trie;

void add(trie *aux, char *s )
{

    if( *s == '\0'){
                ++aux->nr;
                return;
                }
    if( aux->urm[*s-97] == NULL){
                    aux->urm[*s-97] = new trie;
                    ++aux->desc;
                }
    add(aux->urm[*s-97],s+1);
}
int del(trie *aux, char *s)
{
    if( *s == '\0') --aux->nr;
    else if(del(aux->urm[*s-97], s+1)){
                    aux->urm[*s-97] = NULL;
                    --aux->desc;
                    }
    if(aux->nr == 0 && aux->desc == 0 && aux != p)
                    {
                    delete aux;
                    return 1;
                    }
    return 0;

}

int count( trie *aux, char *s )
{

    if( *s == '\0' ) return aux->nr;

    if( aux->urm[*s-97] != NULL)
            return count( aux->urm[*s-97], s+1);

    return 0;
}

int lgprefmax( trie *aux, char *s, int k )
{
    if( *s == '\0' || aux->urm[*s-97] == NULL ) return k;

    return lgprefmax(aux->urm[*s-97], s+1, k+1);

}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    int op;
    char sir[25];

    scanf("%d",&op);
    gets(sir);
    while( !feof(stdin) )
            {

            switch(op)
                {
                case 0: add(p, sir+1); break;
                case 1: del(p, sir+1); break;
                case 2: printf("%d\n",count(p, sir+1)); break;
                case 3: printf("%d\n",lgprefmax(p, sir+1
                                                , 0)); break;
                }

             scanf("%d",&op);
             gets(sir);

            }

    fclose(stdin);
    fclose(stdout);

    return 0;
}