Cod sursa(job #1444628)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 30 mai 2015 00:13:45
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
/**
  *  Worg
  */
#include <cstdio>
#include <cstring>

#define sigma 27
#define val (*s - 'a')

using namespace std;
FILE *fin=freopen("trie.in","r",stdin);
FILE *fout=freopen("trie.out","w",stdout);

struct trie
            {
                int nrfii, cnt;

                trie *fiu[sigma];

                trie()
                {
                    memset(fiu, 0, sizeof(fiu));
                    nrfii = cnt = 0;
                }
            };

trie *T = new trie;

void ins(trie *nod, char *s)
{
    if( *s == '\n' )
    {
        nod -> cnt ++; return;
    }

    if( nod -> fiu[ val ] == 0 )
    {
        nod -> fiu[ val ] = new trie;
        nod -> nrfii ++;
    }

    ins( nod -> fiu[ val ], s + 1 );
}

int del(trie *nod, char *s)
{
    if( *s == '\n' )
        --nod -> cnt;
    else if( del(nod -> fiu[ val ], s + 1) )
    {
        nod -> fiu[ val ] = 0;
        --nod -> nrfii;
    }

    if( !nod -> nrfii && !nod -> cnt && nod != T )
    {
        delete nod; return 1;
    }
    return 0;
}

int query(trie *nod, char *s)
{
    if( *s == '\n' )
        return nod -> cnt;
    if( nod -> fiu[val] )
        return query( nod -> fiu[val], s + 1 );
    return 0;
}

int prefix(trie *nod, char *s, int k)
{
    if( *s == '\n' || nod -> fiu[ val ] == 0 )
        return k;
    return prefix( nod -> fiu[ val ], s + 1, k + 1 );

}

int main()
{
    char S[32];

    fgets(S, 32, stdin);

    while( !feof(stdin) )
    {
        if( S[0] == '0' )
            ins(T, S + 2);
        else if( S[0] == '1' )
            del(T, S + 2);
        else if( S[0] == '2' )
            printf("%d\n", query(T, S + 2) );
        else
            printf("%d\n", prefix(T, S + 2, 0) );


        fgets(S, 32, stdin);
    }
}