Cod sursa(job #1117537)

Utilizator manutrutaEmanuel Truta manutruta Data 23 februarie 2014 17:23:18
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;

#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;
}