Cod sursa(job #1352800)

Utilizator bodyionitaIonita Bogdan Constantin bodyionita Data 21 februarie 2015 13:08:42
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <cstring>
using namespace std;
const int LAlfabet=28;
struct Trie
{
    int Nr;
    int NF;
    Trie *fii[LAlfabet];
    Trie()
    {
        Nr=0;
        NF=0;
        for (int i=0; i<=LAlfabet; i++) fii[i]=NULL;
    }
};
char s[101];

void Insert(Trie *T, char *s)
{
    if (*s==NULL) {T->Nr++; return;}
    if (T->fii[s[0]-'a']==NULL)
    {
        T->fii[s[0]-'a']= new Trie;
        T->NF++;
    }
    Insert(T->fii[s[0]-'a'], s+1);
}

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

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

int Prefix(Trie *T, char *s, int K)
{
    if (*s==NULL || T->fii[s[0]-'a']==NULL) return K;
    else return Prefix(T->fii[s[0]-'a'], s+1, K+1);
}
int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    Trie *T= new Trie;
    while (!feof(stdin))
    {
        int x;
        char c;
        memset(s,'\0',sizeof(s));
        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;
}