Cod sursa(job #1184351)

Utilizator TimeAttackTimer Roby TimeAttack Data 12 mai 2014 12:57:47
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
/*
    Keep It Simple!
*/

#include<fstream>
#include<cstring>
using namespace std;

struct Trie
{
    int NrWords,NrKids;
    Trie *Next[28];
    Trie()
    {
        NrWords = NrKids = 0;
        memset(Next,0,sizeof(Next));
    }
}*T;

void AddToTrie(Trie *node,char *s)
{
    if(s[0] == NULL)
    {
        node->NrWords++;
        return;
    }
    else
    {
        if(!node->Next[s[0]-'a'])
        {
            node->Next[s[0]-'a'] = new Trie;
            node->NrKids++;
        }
        AddToTrie(node->Next[s[0]-'a'],s+1);
    }
}

void RemoveFromTrie(Trie* node,char *s)
{
    if(s[0] == NULL)
    {
        node->NrWords --;
        return;
    }
    else
    {
        RemoveFromTrie(node->Next[s[0] - 'a'],s+1);
        if(node->Next[s[0] - 'a']->NrKids == 0 && node->Next[s[0] - 'a']->NrWords == 0)
            {
                node->Next[s[0] - 'a'] = NULL;
                node->NrKids--;
            }
    }
}

int NumberOfWords(Trie *node, char* s)
{
        if(node->Next[s[0]-'a'] == NULL) return 0;
        if(s[0] == NULL)
            return node->NrWords;
        return NumberOfWords(node->Next[s[0]-'a'],s+1);
}

int LongestPrefix(Trie* node, char* s, int cnt)
{
    if(s[0] == NULL || node->Next[s[0]-'a'] == NULL)
        return cnt;
    return LongestPrefix(node->Next[s[0]-'a'],s+1,cnt+1);
}

int main()
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    T = new Trie();
    int type;
    char c[25];

    while( f >> type >> c )
    {
        switch(type)
            {
                    case 0: AddToTrie(T,c); break;
                    case 1: RemoveFromTrie(T,c); break;
                    case 2: g << NumberOfWords(T,c) << "\n"; break;
                    case 3: g << LongestPrefix(T,c,0) << "\n"; break;
            }
    }

    f.close();
    g.close();
    return 0;
}