Cod sursa(job #1741359)

Utilizator sulzandreiandrei sulzandrei Data 13 august 2016 19:00:15
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define CH *s-97

struct Trie
{
    int words;
    int prefixies;
    Trie** edges;
    Trie()
    {
        edges = new Trie*[26];
        words = prefixies = 0;
        for(int i = 0 ; i <26 ; i++)
            edges[i] = nullptr;
    }
    ~Trie()
    {
        delete []edges;
    }
} *T = new Trie();
void insertWord(Trie* node,char *s)
{
    if(node->edges[CH]== NULL)//daca nu exista muchii
        node->edges[CH] = new Trie;//adaugam vertexu ca si copil
    node->prefixies++;
    if(*(s+1)=='\0')
        node->edges[CH]->words++;
    else
        insertWord(node->edges[CH],s+1);
}
bool eraseWord(Trie* node,char *s)
{
    if(*s == '\0')
        node->words--;
    else
    {
        node->prefixies--;
        if(eraseWord(node->edges[CH],s+1))
        {
            delete node->edges[CH];
            node->edges[CH] = nullptr;
        }
    }
    if(node->words == 0 && node->prefixies == 0)
            return true;
    return false;
}
int aparitii(Trie*node,char *s)
{
    if(node != NULL && *s!='\0')
        return aparitii(node->edges[CH],s+1);
    if(*s == '\0' && node != NULL)
        return node->words;
    return 0;
}
int lungimeCeluiMaiLungPrefix(Trie* node, char *s)
{
    if(node->edges[CH]!= NULL && *s !='\0')
        return 1 + lungimeCeluiMaiLungPrefix(node->edges[CH],s+1);
    return 0;
}
int main()
{
    char *s = new char[40];
    while(in.getline(s,30))
    {

        switch(s[0])
        {
        case '0':
            insertWord(T,s+2);
            break;
        case '1':
            eraseWord(T,s+2);
            break;
        case '2':
            out << aparitii(T,s+2)<<'\n';
            break;
        case '3':
            out << lungimeCeluiMaiLungPrefix(T,s+2)<<'\n';
            break;
        }

    }
    /*
    insertWord(T,"lat");
    eraseWord(T,"lat");
    insertWord(T,"latitudine");
    insertWord(T,"lat");
    cout<<lungimeCeluiMaiLungPrefix(T,"latime");*/


    return 0;
}