Cod sursa(job #1741348)

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

struct Trie
{
    int words;
    int prefixies;
    Trie* edges[26];
    Trie()
    {
        words = prefixies = 0;
        for(int i = 0 ; i <26 ; i++)
            edges[i] = nullptr;
    }
} *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')
        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()
{
    int x;
    string cuv;
    char *s;
    while( in >> x >> cuv)
    {
        s = new char[cuv.size()+1];
        for(int i = 0 ; i < cuv.size() ; i++)
            s[i] = cuv[i];
        s[cuv.size()] = '\0';
        switch(x)
        {
        case 0:
            insertWord(T,s);
            break;
        case 1:
            eraseWord(T,s);
            break;
        case 2:
            out << aparitii(T,s) << '\n';
            break;
        case 3:
            out << lungimeCeluiMaiLungPrefix(T,s)<<'\n';
            break;
        }
        delete []s;
    }/*
    insertWord(T,"lat");
    eraseWord(T,"lat");
    insertWord(T,"latitudine");
    insertWord(T,"lat");
    cout<<lungimeCeluiMaiLungPrefix(T,"latime");*/


    return 0;
}