Cod sursa(job #2269710)

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

};
Trie * trie = new Trie;
char c[20];
int op;

void AddWord(Trie * t, char * c)
{
    if(*c == '\0')
    {
        t->words++;
        return;
    }
    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()
{

    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();
}