Cod sursa(job #1210239)

Utilizator cojocarugabiReality cojocarugabi Data 19 iulie 2014 15:00:43
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
#include <cstring>
#define ch (*c - 'a')

using namespace std;

struct trie
{
     int nr,n;
     trie *p[26];
     trie()
     {
         nr=n=0;
         memset(p , 0 , sizeof(p));
     }
};
trie *t = new trie;
void adauga(trie *nod,char *c)
{
    if (*c == '\n')
    {
        nod->n++;return;
    }
    if (nod->p[ch] == 0)
    {
        nod->p[ch] = new trie;
        nod->nr++;
    }
    adauga(nod->p[ch],c+1);
}
int sterge(trie *nod,char *c)
{
    if (*c == '\n')
        nod->n--;
    else
    if (sterge(nod->p[ch],c+1))
    {
        nod->p[ch] = 0;
        nod->nr--;
    }
    if (nod->n == 0 && nod->nr == 0 && nod != t)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int word(trie *nod,char *c)
{
    if (*c == '\n')
        return nod->n;
    if (nod->p[ch])
      return word(nod->p[ch],c+1);
    return 0;
}
int pre(trie *nod,char *c,int k)
{
    if (*c == '\n' || nod->p[ch] == 0)
        return k;
    return pre(nod->p[ch],c+1,k+1);
}
int main()
{
    char line[32];
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    fgets(line,32,stdin);
    while (!feof(stdin))
    {
        if (line[0] == '0')
            adauga(t,line+2);
        else
        if (line[0] == '1')
            sterge(t,line+2);
        else
        if (line[0] == '2')
            printf("%d\n",word(t,line+2));
        else
        if (line[0] == '3')
            printf("%d\n",pre(t,line+2,0));
        fgets(line,32,stdin);
    }
    return 0;
}