Cod sursa(job #1914296)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 8 martie 2017 16:22:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#include <fstream>
#include <cstring>
using namespace std;

ofstream out("trie.out");


struct Trie
{
    int Count, nr_Sons;
    Trie* son[26];

    Trie()
    {
        Count = nr_Sons = 0;
        memset(son, 0, sizeof(son));
    }
};

Trie* T = new Trie;

void Insert(Trie* node, char* s)
{
    if(*s == '\n')
    {
        node->Count++;
        return;
    }

    if(node->son[*s-'a'] == 0)
    {
        node->son[*s-'a'] = new Trie;
        node->nr_Sons++;
    }

    Insert(node->son[*s-'a'], s+1);
}

bool Delete(Trie* node, char* s)
{
    if(*s == '\n')
        node->Count--;
    else if(Delete(node->son[*s-'a'], s+1))
    {
        node->son[*s-'a'] = 0;
        node->nr_Sons--;
    }

    if(node->Count == 0 & node->nr_Sons == 0 & node != T)
    {
        delete node; return 1;
    }

    return 0;
}

int query(Trie* node, char* s)
{
    if(*s == '\n')
        return node->Count;

    if(node->son[*s-'a'])
        return query(node->son[*s-'a'],s+1);
    return 0;
}

int prefix(Trie* node, char* s, int k)
{
    if(*s == '\n' || node->son[*s-'a'] == 0)
        return k;
    return prefix(node->son[*s-'a'],s+1,k+1);
}

int main()
{
    char line[23];

    freopen("trie.in", "r", stdin);
    fgets(line, 23, stdin);
    while(!feof(stdin))
    {
        switch(line[0])
        {
            case '0': Insert(T, line+2); break;
            case '1': Delete(T, line+2); break;
            case '2': out << query(T, line+2) << "\n"; break;
            case '3': out << prefix(T, line+2, 0) << "\n"; break;
        }

        fgets(line, 23, stdin);
    }
    return 0;
}