Cod sursa(job #1352514)

Utilizator bodyionitaIonita Bogdan Constantin bodyionita Data 21 februarie 2015 12:42:28
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
using namespace std;
const int LAlfabet=28;
struct Trie
{
    int NrApp;
    int Nrfii;
    Trie *fii[LAlfabet];

    Trie()
    {
        NrApp=0;
        Nrfii=0;
        for (int i=0; i<=LAlfabet; i++) fii[i]=NULL;
    }
};
char s[30];
void Insert(Trie *T, char *s)
{
    if (*s==NULL) {T->NrApp++; return;}
    if (T->fii[s[0]-'a']==NULL)
    {
        T->fii[s[0]-'a']= new Trie;
        T->Nrfii++;;
    }
    Insert(T->fii[s[0]-'a'], s+1);
}

void Remove(Trie *T, char *s)
{
    if (*s==NULL) {T->NrApp--;return;}
    Remove(T->fii[s[0]-'a'], s+1);
    if (T->fii[s[0]-'a']->NrApp==0 && T->fii[s[0]-'a']->Nrfii==0)
    {
        T->fii[s[0]-'a']=NULL;
        T->Nrfii--;
    }
}

int Find(Trie *T, char *s)
{
    if (T==NULL) return 0;
    if (*s==NULL) return T->NrApp;
    Find(T->fii[s[0]-'a'], s+1);
}

int Prefix(Trie *T, char *s, int i)
{
    if (*s==NULL || T->fii[s[0]-'a']==NULL) return i;
    else return Prefix(T->fii[s[0]-'a'], s+1, i+1);
}
int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    Trie *T= new Trie;
    while (!feof(stdin))
    {
        int x;
        char c;
        scanf("%d%c", &x, &c);
        gets(s);
        if (*s==NULL) continue;
        if (x==0) Insert(T, s);
        if (x==1) Remove(T, s);
        if (x==2) printf("%d\n", Find(T, s));
        if (x==3) printf("%d\n", Prefix(T, s, 0));
    }
    return 0;
}