Cod sursa(job #876323)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 11 februarie 2013 18:02:32
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
FILE*in=fopen("trie.in","r");
FILE*out=fopen("trie.out","w");
int tip,lungime;
struct trie
{
    int sons;
    int apearance;
    trie *son[26];
    trie()
    {
        sons=0;
        apearance=0;
        memset(son,0,sizeof(son));
    }
};
trie *radacina = new trie;
void adauga(trie *node,char *word);
bool scoate(trie *node,char *word);
int aparitie(trie *node,char *word);
int prefix(trie *node,char *word,int length);
char cuvant[21];
int main()
{
    while(!feof(in))
    {
    fscanf(in,"%d %s ",&tip,cuvant);
    if(tip==0)
        adauga(radacina,cuvant);
        else
        if(tip==1)
            scoate(radacina,cuvant);
            else
            if(tip==2)
                fprintf(out,"%d\n",aparitie(radacina,cuvant));
                else
                    fprintf(out,"%d\n",prefix(radacina,cuvant,lungime));
    }
fclose(in);
fclose(out);
}
void adauga(trie *node,char *word)
{
    if(!*word)
        ++node->apearance;
    else
    {
        if(!node->son[*word-'a'])
        {
            ++node->sons;
            node->son[*word-'a'] = new trie;
        }
        adauga(node->son[*word-'a'],word+1);
    }
}
bool scoate(trie *node,char *word)
{
    if(!*word)
        --node->apearance; // pt ca e MULT mai eficient
    else
    {
        if(scoate(node->son[*word-'a'],word+1))
            {
                --node->sons;
                node->son[*word-'a']=0;
            }
    }
    if(node->sons || node==radacina || node->apearance)
        return false;

    delete node;
    return true;
}
int aparitie(trie *node,char *word)
{
    if(!*word)
        return node->apearance;
    if(node->son[*word-'a'])
        aparitie(node->son[*word-'a'],word+1);
    else return 0;
}
int prefix(trie *node,char *word,int length)
{
    if(!node->son[*word-'a'])
        return length;
    else
        prefix(node->son[*word-'a'],word+1,length+1);
}