Cod sursa(job #1786983)

Utilizator mariakKapros Maria mariak Data 23 octombrie 2016 22:36:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>
#define SIGMA 27
FILE *fin =  freopen("trie.in", "r", stdin);
FILE *fout = freopen("trie.out", "w", stdout);

using namespace std;
char word[25];
struct Node
{
    Node *son[SIGMA];
    int app_w;
    int app_p;
};
Node *new_empty_node()
{
    Node *node = new Node;
    for(int i = 0; i < SIGMA; ++ i)
        node->son[i] = NULL;
    node->app_w = 0;
    node->app_p = 0;
}
void insert_w(Node *node, char *word)
{
    if(word[0] == 0)
    {
        node->app_w ++;
        return;
    }

    if(node->son[word[0] - 'a'] == NULL)
        node->son[word[0] - 'a'] = new_empty_node();

    node = node->son[word[0] - 'a'];
    node->app_p ++;
    insert_w(node, word + 1);
}
void erase_w(Node *node, char *word)
{
    if(word[0] == 0)
    {
        node->app_w --;
        return;
    }

    node = node->son[word[0] - 'a'];
    if(node->app_p > 0)
        node->app_p --;
    erase_w(node, word + 1);
}
int nr_appearance(Node *node, char *word)
{
    if(word[0] == 0)
        return node->app_w;

    if(node->son[word[0] - 'a'] != NULL)
        nr_appearance(node->son[word[0] - 'a'], word + 1);
    else return 0;
}
int lenght_prefix(Node *node, char *word, int depth)
{
    if(word[0] == 0)
        return depth;

    node = node->son[word[0] - 'a'];
    if(node != NULL && node->app_p > 0)
        lenght_prefix(node, word + 1, depth + 1);
    else
        return depth;
}
int main()
{
    int c;
    Node *root = new_empty_node();
    while(scanf("%d ", &c) != EOF)
    {
        gets(word);
        if(c == 0)
            insert_w(root, word);
        if(c == 1)
            erase_w(root, word);
        if(c == 2)
            printf("%d\n", nr_appearance(root, word));
        if(c == 3)
            printf("%d\n", lenght_prefix(root, word, 0));
    }
    return 0;
}