Cod sursa(job #1088320)

Utilizator TeOOOVoina Teodora TeOOO Data 20 ianuarie 2014 14:36:27
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
//Include
#include <stdio.h>
#include <string.h>
using namespace std;

FILE *in, *out;

//Definitii
#define letter *word - 'a'

//Constante
const int word_size = 21;
const int letters = 26;

//Structuri
struct trie
{
    int words;
    int sons;
    trie *son[letters];

    trie()
    {
        words = sons = 0;
        memset(son, 0, sizeof(son));
    }
};

//Functii
void insert(trie *node, char *word);
bool erase(trie *node, char *word);
int query(trie *node, char *word);
int prefix(trie *node, char *word, int length);

//Variabile
int type;
char currentWord[word_size];
trie *root = new trie;

//Main
int main()
{
	in = fopen("trie.in", "rt");
	out = fopen("trie.out", "wt");

    while(1)
    {
        fscanf(in,"%d%s", &type, currentWord);
        if(feof(in))
            break;
        switch(type)
        {
            case 0: {insert(root, currentWord); break; }
            case 1: {erase(root, currentWord); break; }
            case 2: {fprintf(out, "%d\n", query(root, currentWord)); break; }
            case 3: {fprintf(out, "%d\n", prefix(root, currentWord, 0)); break; }
        }
    }
	fclose(in);
	fclose(out);
	return 0;
}

void insert(trie *node, char *word)
{
    if(!*word)
    {
        ++node->words;
        return;
    }
    if(!node->son[letter])
    {
        ++node->sons;
        node->son[letter] = new trie;
    }
    insert(node->son[letter], word+1);
}

bool erase(trie *node, char *word)
{
    if(!*word)
        --node->words;
    else if(erase(node->son[letter], word+1))
    {
        node->son[letter] = '\0';
        --node->sons;
    }

    if(node == root || node->words || node->sons)
        return false;

    delete node;
    return true;
}

int query(trie *node, char *word)
{
    if(!*word)
        return node->words;

    if(node->son[letter])
        return query(node->son[letter], word+1);

    return 0;
}

int prefix(trie *node, char *word, int length)
{
    if(!*word || !node->son[letter])
        return length;
    return prefix(node->son[letter], word+1, length+1);
}