Cod sursa(job #1189550)

Utilizator danalex97Dan H Alexandru danalex97 Data 23 mai 2014 10:06:09
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 v,sz;
    trie *sons[26];

    trie()
    {
        v = sz = 0;
        memset(sons,0,sizeof(sons));
    }

    int find(char* c)
    {
        if ( *c == 0 )
            return v;
        if ( sons[int(*c)-int('a')] != NULL )
            return sons[int(*c)-int('a')]->find(c+1);
        else
            return 0;
    }

    void add(char *c)
    {
        if ( *c == 0 )
        {
            v++;
            sz++;
            return;
        }
        if ( sons[int(*c)-int('a')] == NULL )
            sons[int(*c)-int('a')] = new trie();

        sz -= sons[int(*c)-int('a')]->sz;
        sons[int(*c)-int('a')]->add(c+1);
        sz += sons[int(*c)-int('a')]->sz;
    }

    void remove(char *c)
    {
        if ( *c == 0 )
        {
            v--;
            sz--;
            return;
        }
        if ( sons[int(*c)-int('a')]->sz == 0 )
            sons[int(*c)-int('a')] = new trie();
        else
        {
            sz -= sons[int(*c)-int('a')]->sz;
            sons[int(*c)-int('a')]->remove(c+1);
            sz += sons[int(*c)-int('a')]->sz;
            if ( sons[int(*c)-int('a')]->sz == 0 )
                sons[int(*c)-int('a')] = NULL;
        }
    }

    int count(char *c,int now)
    {
        if ( *c == 0 )
            return now;
        if ( sons[int(*c)-int('a')] != NULL )
            return sons[int(*c)-int('a')]->count(c+1,now+1);
        else
            return now;
    }
};

const int size = 30;

trie *tree = new trie();
char c[size];
int type;

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while ( ~scanf("%d %s\n",&type,c) )
    {
        if ( type == 0 ) tree->add(c);
        if ( type == 1 ) tree->remove(c);
        if ( type == 2 ) printf("%d\n",tree->find(c));
        if ( type == 3 ) printf("%d\n",tree->count(c,0));
    }
}