Cod sursa(job #2269701)

Utilizator crion1999Anitei cristi crion1999 Data 26 octombrie 2018 14:20:02
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#define ALPHABET 27
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct Trie{
    int words = 0;
    int prefixes = 0;
    Trie *edges[ALPHABET] = {0};

};

void AddWord(Trie * t, char * c)
{
    if(*c == '\0')
        t->words++;
    else
    {
        if(t->edges[*c - 'a'] == NULL)
        {
            t->edges[*c - 'a'] = new Trie;
            t->prefixes++;
        }
        AddWord(t->edges[*c - 'a'], c+1);
    }
}

void DeleteWord(Trie * t, char * c)
{
    if(*c == '\0')
        t->words--;
    else
    {
        DeleteWord(t->edges[*c - 'a'], c+1);
        if(t->edges[*c - 'a']->words == 0 && t->edges[*c - 'a']->prefixes == 0)
        {
            delete t->edges[*c - 'a'];
            t->prefixes--;
            t->edges[*c - 'a'] = NULL;
        }
    }
}

int FindWord(Trie * t, char * c)
{
    if(*c == '\0')
        return t->words;
    if(t->edges[*c - 'a'] == NULL)
        return 0;
    return FindWord(t->edges[*c - 'a'], c+1);
}

int FindPrefixes(Trie * t, char * c)
{
    if(*c == '\0') return 0;
    if(t->edges[*c - 'a'] == NULL) return 0;
    return 1 + FindPrefixes(t->edges[*c - 'a'], c+1);
}


int main()
{
    Trie * trie = new Trie;
    char c[100];
    int op;
    while(fi >> op)
    {
        fi>>c;
        switch(op)
        {
            case 0: AddWord(trie, c); break;
            case 1: DeleteWord(trie, c); break;
            case 2: fo<<FindWord(trie, c)<<'\n'; break;
            case 3: fo<<FindPrefixes(trie, c)<<'\n'; break;
        }
    }
    fi.close();
    fo.close();
}