Cod sursa(job #2144251)

Utilizator AndreiTurcasTurcas Andrei AndreiTurcas Data 26 februarie 2018 17:18:39
Problema Trie Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define ch *x - 'a'
using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct Trie{
    int words, prefixes;
    Trie *Edges[26];
    Trie(){
        words = prefixes = 0;
        memset(Edges, 0, sizeof(Edges));
    }
    };

int v;
char s[35];
Trie *T = new Trie;

inline void _insert(char *x, Trie *node)
{
    if(*x == 0)
    {
        node->words++;
        return;
    }
    if(node->Edges[ch] == 0)
    {
        node->Edges[ch] = new Trie;
        node->prefixes++;
    }
    _insert(x+1, node->Edges[ch]);
}

inline bool _erase(char *x, Trie *node)
{
    if(*x == 0)
    {
        node->words--;
        if(node->words == 0 && node->prefixes == 0 && node != T)
        {
            delete node;
            return 1;
        }
        return 0;
    }
    if(_erase(x+1, node->Edges[ch]))
    {
        node->prefixes--;
        node->Edges[ch] = 0;
        if(node -> words == 0 && node->prefixes == 0 && node != T)
        {
            delete node;
            return 1;
        }
    }
        return 0;
}

inline int Wnumber(char *x, Trie *node)
{
    if(*x == 0)
        return node->words;
    if(node->Edges[ch] == 0)
        return 0;
    return Wnumber(x+1, node->Edges[ch]);
}

inline int Pref(char *x, Trie *node)
{
    if(*x == 0)
        return 0;
    if(node->Edges[ch] == 0)
        return 0;
    return Pref(x+1, node->Edges[ch]) +1;
}

int main()
{
    while(f >> v >> s)
    {
        if(v == 0) _insert(s, T);
        else if(v == 1) _erase(s, T);
        else if(v == 2) g << Wnumber(s, T) << "\n";
        else g << Pref(s, T) << "\n";
    }
}