Cod sursa(job #995663)

Utilizator manutrutaEmanuel Truta manutruta Data 10 septembrie 2013 00:53:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>
#include <cstring>

#define ALF 27

struct trie {
    int key, nrChild;
    trie *child[ALF];
    trie() {
        key=nrChild=0;
        memset(child,0,sizeof(child));
    }
};

FILE *f = fopen("trie.in","r");
FILE *g = fopen("trie.out","w");

trie root;
char buf[100];

void add(trie *ptr,char* c)
{
    while (*c != '\n') {
        if(ptr->child[*c - 'a'] == 0) {
            ptr->child[*c - 'a'] = new trie(),ptr->nrChild++;
        }
        ptr=ptr->child[*c - 'a'],c++;
    }
    ptr->key++;
}
int del(trie* ptr,char* c)
{
    if(*c=='\n') {
        ptr->key--;
    } else if(del(ptr->child[*c-'a'],c+1)) {
        ptr->child[*c-'a']=0;
        ptr->nrChild--;
    }
    if(ptr->key==0&&ptr->nrChild==0&&ptr!=&root) {
        delete ptr;
        return 1;
    }
    return 0;
}
int num(trie* ptr,char* c)
{
    while(*c!='\n') {
        if(ptr->child[*c-'a']==0) {
            return 0;
        }
        ptr=ptr->child[*c-'a'],c++;
    }
    return ptr->key;
}
int lcp(trie* ptr,char* c)
{
    int nr=0;
    while(*c!='\n'&&ptr->child[*c-'a']) {
        ptr=ptr->child[*c-'a'],nr++,c++;
    }
    return nr;
}
int main()
{
    int op, len;
    while (fgets(buf, sizeof(buf), f)) {
        switch(buf[0]) {
        case '0':
            add(&root,buf+2);
            break;
        case '1':
            del(&root,buf+2);
            break;
        case '2':
            fprintf(g,"%d\n",num(&root,buf+2));
            break;
        case '3':
            fprintf(g,"%d\n",lcp(&root,buf+2));
            break;
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}