Cod sursa(job #828509)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 3 decembrie 2012 20:56:24
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;

struct Trie {
    #define SIGMA 26
    int cnt, nrfii;
    Trie *fiu[SIGMA];
    Trie() {
        memset(fiu, 0 ,sizeof(fiu));
    }
};

void add(Trie *node, int len, string &s) {
    if(len == s.length()) {
        node->cnt++;

        return;
    }
    if(node->fiu[s[len]-'a'] == NULL) {
        node->fiu[s[len]-'a'] = new Trie();
        node->nrfii++;
    }
    add(node->fiu[s[len]-'a'], len+1, s);
}

int find(Trie *node, int len, string &s) {
    if(len == s.length()) {
        return node->cnt;
    }
    if(node->fiu[s[len]-'a'] == NULL) {
        return 0;
    }
    return find(node->fiu[s[len]-'a'], len+1, s);
}

bool remove(Trie *node, int len, string &s) {
    if(len == s.length()) {
        node->cnt--;
        if(node->nrfii == 0 && node->cnt == 0) {
            delete node;
            return true;
        }
        return false;
    }
    if(remove(node->fiu[s[len]-'a'], len+1, s)) {
        node->nrfii--;
        node->fiu[s[len]-'a'] = NULL;
    }
    if(node->nrfii == 0 && node->cnt == 0) {
        delete node;
        return true;
    }
    return false;
}

int prefix(Trie *node, int len, string &s) {
    if(len == s.length() || node->fiu[s[len]-'a'] == NULL) {
        return 0;
    }
    if(node->fiu[s[len]-'a'] == NULL) {
        node->fiu[s[len]-'a'] = new Trie();
        node->nrfii++;
    }
    return 1 + prefix(node->fiu[s[len]-'a'], len+1, s);
}

Trie *head = new Trie();
int main() {
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    string s; int x;
    char str[50];
    while(!feof(stdin)) {

        scanf("%d %s\n", &x, str);
        s = str;
        if(x == 0) {
            add(head, 0, s);
        }
        else if(x == 1) {
            remove(head, 0, s);
        }
        else if(x == 2) {
            cout << find(head, 0, s) << endl;
        }
        else if(x == 3) {
            cout << prefix(head, 0, s) << endl;
        }
    }
    return 0;
}