Cod sursa(job #1483842)

Utilizator GinguIonutGinguIonut GinguIonut Data 9 septembrie 2015 23:39:20
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <cstring>

#define CH (*s - 'a')

using namespace std;

struct Trie
{
    int cnt, nrfii;
    Trie *fiu[26];
    Trie()
    {
        cnt=nrfii=0;
        memset(fiu, 0, sizeof(fiu));
    }
};
Trie *T = new Trie;
 void ins(Trie *nod, char *s)
 {
     if(*s=='\n')
     {
         nod->cnt++;
         return;
     }
     if(nod->fiu[CH]==0)
     {
         nod->fiu[CH]=new Trie;
         nod->nrfii++;
     }
     ins(nod->fiu[CH], s+1);
 }

 int del(Trie *nod, char *s)
 {
     if(*s=='\n')
        nod->cnt--;
     else
        if(del(nod->fiu[CH], s+1))
        {
             nod->nrfii--;
             nod->fiu[CH]=0;
        }
    if(nod->cnt==0 && nod->nrfii==0 && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
 }

 int que(Trie *nod, char *s)
 {
     if(*s=='\n')
        return nod->cnt;
    if(nod->fiu[CH])
        return que(nod->fiu[CH], s+1);
    return 0;
 }

 int pre(Trie *nod, char *s, int k)
 {
     if(*s=='\n' || nod->fiu[CH]==0)
        return k;
     return pre(nod->fiu[CH], s+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))
    {
        switch(line[0])
        {
            case '0':ins(T, line+2);break;
            case '1':del(T, line+2);break;
            case '2':printf("%d\n", que(T, line+2));break;
            case '3':printf("%d\n", pre(T, line+2, 0));break;
        }
        fgets(line, 32, stdin);
    }
    return 0;
}