Pagini recente » Cod sursa (job #656997) | Cod sursa (job #255752) | Cod sursa (job #38480) | Cod sursa (job #891893) | Cod sursa (job #1455305)
#include <iostream>
#include <fstream>
#include <list>
const char IN[] = "trie.in", OUT[] = "trie.out";
const int MAXLEN = 20;
const int ALPHABET = 26;
using namespace std;
ifstream fin(IN);
ofstream fout(OUT);
struct node{
int freq, succs_count;
node* succs[ALPHABET];
};
node *tree;
void add_word(node* crt_node, char *c) {
if (*c == '\n' || *c == '\0') {
++crt_node->freq;
return;
}
int key = *c - 'a';
if (crt_node->succs[key] != NULL)
add_word(crt_node->succs[key], ++c);
else {
++crt_node->succs_count;
crt_node->succs[key] = new node();
crt_node->succs[key]->freq = 0;
add_word(crt_node->succs[key], ++c);
}
}
int remove_word(node *crt_node, char *c) {
if (*c == '\n' || *c == '\0') {
--crt_node->freq;
if (crt_node->freq == 0 && crt_node->succs_count == 0 && crt_node != tree) {
delete crt_node;
return 1;
}
return 0;
}
int key = *c - 'a';
if (remove_word(crt_node->succs[key], c + 1)) {
--crt_node->succs_count;
crt_node->succs[key] = NULL;
}
if (crt_node->freq == 0 && crt_node->succs_count == 0
&& crt_node != tree) {
delete crt_node;
return 1;
}
return 0;
}
int count_app(node *crt_node, char *c) {
if (*c == '\0' || *c == '\n') return crt_node->freq;
int key = *c - 'a';
if (crt_node->succs[key] == NULL) return 0;
else return count_app(crt_node->succs[key], ++c);
}
int largest_prefix(node *crt_node, char *c) {
if (*c == '\n' || *c == '\0') return 0;
int key = *c - 'a';
if (crt_node->succs[key] == NULL) return 0;
else return 1 + largest_prefix(crt_node->succs[key], c + 1);
}
inline void read_data() {
int op;
char word[MAXLEN];
while ((fin >> op >> word)) {
switch (op) {
case 0: add_word(tree, word); break;
case 1: remove_word(tree, word); break;
case 2: fout << count_app(tree, word) << endl; break;
case 3: fout << largest_prefix(tree, word) << endl; break;
}
}
}
int main() {
std::ios::sync_with_stdio(false);
tree = new node();
tree->freq = 0;
read_data();
fin.close();
fout.close();
}