Cod sursa(job #1329420)

Utilizator ooptNemes Alin oopt Data 29 ianuarie 2015 14:46:28
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
/// trie
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>
#define ch(a) ((a)-'a')
using namespace std;

struct trie {
    int cnt, fii;
    trie *son[26];
    trie() {
        cnt = fii = 0;
        for (int i=0;i<26;i++)
            son[i] = NULL;
    }
};

ifstream f("trie.in");
ofstream g("trie.out");

trie *root;
string in;

void insertOnTrie(int index, trie *node) {
    if (index == in.size()) {
        node->cnt++;
        return;
    }
    if (node->son[ch(in[index])] == NULL) {
        node->son[ch(in[index])] = new trie();
        node->fii++;
    }
    insertOnTrie(index+1, node->son[ch(in[index])]);
}

bool deleteOnTrie(int index, trie *node) {
    if (index == in.size()) {
        node->cnt--;
    } else if (deleteOnTrie(index+1, node->son[ch(in[index])])) {
        node->fii--;
        node->son[ch(in[index])] = NULL;
    }

    if (node->fii == 0 && node->cnt == 0 && node !=  root) {
        delete node;
        return true;
    }

    return false;
}

int queryTrie(int index, trie *node) {
    if (index == in.size()) {
        return node->cnt;
    }
    if (node->son[ch(in[index])] == NULL) {
        node->son[ch(in[index])] = new trie();
        node->fii++;
    }
    return queryTrie(index+1, node->son[ch(in[index])]);
}

int triePrefix(int index, trie *node, int k) {
    if (index == in.size())
        return k;

    if (node->son[ch(in[index])] != NULL)
        return triePrefix(index+1, node->son[ch(in[index])], k+1);
    else
        return k;
}

int main() {

    int type;
    root = new trie();
    while (f >> type) {
        f>>in;
        if (type == 0) {
            insertOnTrie(0, root);
        } else if (type == 1) {
            deleteOnTrie(0, root);
        } else if (type == 2) {
            g<<queryTrie(0, root)<<'\n';
        } else if (type == 3 ) {
            g<<triePrefix(0, root, 0)<<'\n';
        }
    }

    f.close(); g.close();
    return 0;
}