Cod sursa(job #1846149)

Utilizator mihaidanielmihai daniel mihaidaniel Data 12 ianuarie 2017 11:44:47
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct trie
{
    trie* next[26];
    int fin, nr_cuv;
    trie()
    {
        memset( next, '\0', sizeof(next) );
        fin = 0;
        nr_cuv = 0;
    }
} *treeroot = new trie();

void insert( trie *node, char *str )//insert
{
    ++node->nr_cuv;
    if( *str==0 )
    {
        ++node->fin;
        return;
    }
    if( !node->next[*str-'a'] )
    {
        node->next[*str-'a'] = new trie();
    }
    insert( node->next[*str-'a'], str+1 );
}

int fnd( trie *node, char *s )//find
{
    if( !node )
    {
        return 0;
    }
    if( *s==0 )
    {
        return node->fin;
    }
    return fnd( node->next[*s-'a'], s+1 );
}

void dlt( trie *node, char *s )//delete
{
    if( *s==0 )
    {
        --node->fin;
        return;
    }
    dlt( node->next[*s-'a'], s+1 );
    if( node->next[*s-'a']->nr_cuv > 1 )
    {
        --node->next[*s-'a']->nr_cuv;
    }
    else
    {
        delete node->next[*s-'a'];
        node->next[*s-'a']= '\0';
    }
}

int prefix( trie *node, char *s )
{
    if( node->next[*s-'a']=='\0' )
    {
        return 0;
    }
    return 1 + prefix( node->next[*s-'a'], s+1 );
}

int main()
{
    freopen( "trie.in", "r", stdin );
    freopen( "trie.out", "w", stdout );
    char s[26];
    int x;
    while( scanf( "%d%s", &x, s )!=EOF )
    {
        switch( x )
        {
        case 0:
            insert( treeroot, s );
            break;
        case 1:
            if( fnd( treeroot, s) )
            {
                dlt( treeroot, s );
            }
            break;
        case 2:
            printf( "%d\n", fnd( treeroot, s ) );
            break;
        case 3:
            printf( "%d\n", prefix( treeroot, s ) );
            break;
        default:
            printf("!");
        }
    }
    return 0;
}