Cod sursa(job #595730)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 13 iunie 2011 19:48:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include <cstdio>

using namespace std;

struct Trie
{
    int NCuv;
    int NFii;
    Trie *Fiu[26];
    Trie ()
    {
        NCuv=0;
        NFii=0;
        memset (Fiu, 0, sizeof (Fiu));
    }
};

Trie *T=new Trie;

void Insert (Trie *Nod, char *Litera)
{
    if (*Litera=='\n')
    {
        Nod -> NCuv++;
        return;
    }
    if (Nod -> Fiu [*Litera-'a']==0)
    {
        Nod -> Fiu [*Litera-'a']=new Trie;
        Nod -> NFii++;
    }
    Insert (Nod -> Fiu[*Litera-'a'], Litera+1);
}

int Delete (Trie *Nod, char *Litera)
{
    if (*Litera=='\n')
    {
        Nod -> NCuv--;
    }
    else
    {
        if (Delete (Nod -> Fiu[*Litera-'a'], Litera+1)==1)
        {
            Nod -> NFii--;
            Nod -> Fiu[*Litera-'a']=0;
        }
    }
    if ((Nod -> NCuv==0)&&(Nod -> NFii==0)&&(Nod!=T))
    {
        delete Nod;
        return 1;
    }
    return 0;
}

int Prefix (Trie *Nod, char *Litera, int L)
{
    if ((*Litera=='\n')||(Nod -> Fiu[*Litera-'a']==0))
    {
        return L;
    }
    return Prefix (Nod -> Fiu[*Litera-'a'], Litera+1, L+1);
}

int Query (Trie *Nod, char *Litera)
{
    if (*Litera=='\n')
    {
        return Nod -> NCuv;
    }
    if (Nod -> Fiu[*Litera-'a']!=0)
    {
        return Query (Nod -> Fiu[*Litera-'a'], Litera+1);
    }
    return 0;
}



int main()
{
    FILE *fin = fopen ("trie.in", "r");
    FILE *fout = fopen ("trie.out", "w");
    char Cuvant[25];
    int Tip;
    while (fscanf (fin, "%d", &Tip)!=EOF)
    {
        fscanf (fin, "%s", &Cuvant);
        strcat (Cuvant, "\n\0");
        switch (Tip)
        {
            case 0 : Insert (T, Cuvant);
                     break;
            case 1 : Delete (T, Cuvant);
                     break;
            case 2 : fprintf (fout, "%d\n", Query (T, Cuvant));
                     break;
            case 3 : fprintf (fout, "%d\n", Prefix (T, Cuvant, 0));
                     break;
            default: break;
        }
    }
    fclose (fin);
    fclose (fout);
    return 0;
}