Cod sursa(job #1741418)

Utilizator sulzandreiandrei sulzandrei Data 13 august 2016 20:47:39
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.41 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
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 insertWordn(Trie* node,char *s)
{
    do
    {
        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
            node = node->edges[CH];
        s++;

    }while(*s!='\0');

}
bool eraseWordn(Trie* node,char *s)
{
    Trie *cnode = node;
    stack< pair<Trie*,int> > toErase;
    pair<Trie*,int> nodepair;
    while(*(s+1) != '\0')
    {
        cnode->prefixies--;
        toErase.push(make_pair(cnode->edges[CH],CH));
        cnode = cnode->edges[CH];
        s++;
    }
    cnode->words--;
    do
    {
        nodepair = toErase.top();
        if(cnode->prefixies == 0 && cnode->words == 0)
        {
            delete nodepair.first->edges[nodepair.second];
            nodepair.first->edges[nodepair.second] = nullptr;
        }
        cnode = nodepair.first;
        toErase.pop();
    }while(!toErase.empty());
}
int aparitii(Trie*node,char *s)
{
    while(node != NULL && *s!='\0')
    {
        node = node->edges[CH];
        s++;
    }
    if(*s == '\0' && node != NULL)
        return node->words;
    return 0;
}
int lungimeCeluiMaiLungPrefix(Trie* node, char *s)
{
    int nr = 0;
    while(node->edges[CH]!= NULL && *s !='\0')
    {
        nr++;
        node = node->edges[CH];
        s++;
    }
    return nr;
}
int main()
{
    char *s = new char[40];
    while(in.getline(s,30))
    {

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

    }
    return 0;
}