Cod sursa(job #1335892)

Utilizator ooptNemes Alin oopt Data 6 februarie 2015 00:16:14
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 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->fii++;
        node->son[ch(in[index])] = new trie();
    }
 
    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)
        return 0;
    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;
}