Pagini recente » Cod sursa (job #2304377) | Cod sursa (job #2916210) | Cod sursa (job #747383) | Cod sursa (job #512336) | Cod sursa (job #1455308)
#include <iostream>
#include <fstream>
#include <assert.h>
const char IN[] = "trie.in", OUT[] = "trie.out";
const int MAXLEN = 20;
const int ALPHABET = 26;
using namespace std;
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 ((scanf("%d %s", &op, word)) == 2) {
switch (op) {
case 0: add_word(tree, word); break;
case 1: remove_word(tree, word); break;
case 2: printf("%d\n",count_app(tree, word)); break;
case 3: printf("%d\n", largest_prefix(tree, word)); break;
}
}
}
int main() {
freopen(IN, "r", stdin);
freopen(OUT, "w", stdout);
tree = new node();
tree->freq = 0;
read_data();
fclose(stdin);
fclose(stdout);
}