Cod sursa(job #1741328)

Utilizator sulzandreiandrei sulzandrei Data 13 august 2016 17:56:00
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 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;
    }
    ~Trie()
    {
        clear(this);
    }
    void clear(Trie* node)
    {
        if(node->prefixies>0)
        {
            for(int i = 0 ; i < 26 ; i++)
                clear(node->edges[i]);
            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);
}
void eraseWord(Trie* node,char *s)
{
    if(*s == '\0')
        node->words--;
    else
    {
        node->prefixies--;
        eraseWord(node->edges[CH],s+1);
    }
    /*
    if(goToBottom->words == 0 && goToBottom->prefixies == 0 && T != goToBottom)
    {
        Trie* eraseBottom = node;
        s = word;
        while(*(s+1)!='\0' && eraseBottom->prefixies>0)
        {
            eraseBottom = eraseBottom->edges[CH];
            s++;
        }
        delete eraseBottom->edges[CH];
    }*/
}
int aparitii(Trie*node,char *s)
{
    while(*s!='\0')
    {
        node = node->edges[CH];
        s++;
    }
    return node->words;
}
int lungimeCeluiMaiLungPrefix(Trie* node, char *s)
{
    int lungime = 0;
    while(*s!='\0' && node->edges[CH]!=NULL && (node->edges[CH]->prefixies>0 || node->edges[CH]->words>0))
    {
        lungime++;
        node = node->edges[CH];
        s++;
    }
    return lungime;
}
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;
}