Pagini recente » Cod sursa (job #952075) | Cod sursa (job #907080) | Cod sursa (job #921326) | Cod sursa (job #925122) | Cod sursa (job #2285582)
#include <stdio.h>
#define ASIZE 26
struct Tr {
Tr() {
app = ccnt = 0;
for (int i = 0; i < ASIZE; ++i) {
next[i] = 0;
}
}
Tr* next[ASIZE];
int app, ccnt;
};
Tr * root = new Tr();
void add_word(char* w) {
Tr *node = root;
while (*w) {
int ix = int(*w - 'a');
if (node->next[ix] == 0) {
Tr* new_node = new Tr();
node->next[ix] = new_node;
node->ccnt++;
node = new_node;
} else {
node = node->next[ix];
}
w++;
}
if (node != root) {
node->app += 1;
}
}
bool delete_(char* w, Tr* node) {
if (*w == 0) {
node->app--;
} else {
int ix = int(w[0] - 'a');
if (node->next[ix] != 0) {
if (delete_(w+1, node->next[ix])) {
node->ccnt--;
node->next[ix] = 0;
}
}
}
if (node->app <= 0 && node->ccnt <= 0 && node != root) {
delete node;
return 1;
}
return 0;
}
void delete_word(char* w) {
delete_(w, root);
}
int get_word(char* w) {
Tr *node = root;
while (*w) {
int ix = int(*w - 'a');
if (node->next[ix] == 0) {
return 0;
} else {
node = node->next[ix];
}
w++;
}
return node->app;
}
int get_longest(char* w) {
Tr *node = root;
int longest_pref = 0;
while (*w) {
int ix = int(*w - 'a');
if (node->next[ix] == 0) {
return longest_pref;
} else {
longest_pref += 1;
node = node->next[ix];
}
w++;
}
return longest_pref;
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int type;
char word[20];
while (scanf("%d %s", &type, word) != EOF) {
switch (type) {
case 0:
add_word(word);
break;
case 1:
delete_word(word);
break;
case 2:
printf("%d\n", get_word(word));
break;
case 3:
printf("%d\n", get_longest(word));
break;
}
}
fclose(stdin);
fclose(stdout);
return 0;
}