Pagini recente » Cod sursa (job #68126) | Cod sursa (job #312283) | Cod sursa (job #2064500) | Cod sursa (job #1212322) | Cod sursa (job #615237)
Cod sursa(job #615237)
#include <stdio.h>
#include <stdlib.h>
#define INPUT "trie.in"
#define OUTPUT "trie.out"
#define SIGMA 26
#define MAX 21
#define SUCCESS 0
typedef struct _node {
int words;
int prefs;
struct _node* edges[SIGMA];
} node;
node* init() {
node* n = (node*) malloc(sizeof(node));
n->prefs = n->words = 0;
int i;
for (i = 0; i < SIGMA; i++) {
n->edges[i] = NULL;
}
return n;
}
void cleanup(node* v) {
int i;
for (i = 0; i < SIGMA; i++) {
if (v->edges[i]) {
cleanup(v->edges[i]);
}
}
free(v);
}
void insert(node* v, char* word) {
if (!word[0]) {
v->words++;
} else {
int k = word[0] - 'a';
v->prefs++;
if (!v->edges[k]) {
v->edges[k] = init();
}
insert(v->edges[k], word + 1);
}
}
void rem(node* v, char* word) {
if (!word[0])
v->words--;
else {
v->prefs--;
int k = word[0] - 'a';
node* e = v->edges[k];
rem(e, word + 1);
if (!e->words && !e->prefs) {
free(e);
v->edges[k] = NULL;
}
}
}
int words(node* v, char* word) {
if (!word[0])
return v->words;
else {
int k = word[0] - 'a';
if (v->edges[k])
return words(v->edges[k], word + 1);
else
return 0;
}
}
int prefix(node* v, char* word) {
if (!word[0])
return 0;
else {
int k = word[0] - 'a';
if (v->edges[k])
return 1 + prefix(v->edges[k], word + 1);
else
return 0;
}
}
int main() {
freopen(INPUT, "r", stdin);
freopen(OUTPUT, "w", stdout);
node* v = init();
while (!feof(stdin)) {
int op;
char word[MAX];
scanf("%d %s\n", &op, word);
switch (op) {
case 0:
insert(v, word);
break;
case 1:
rem(v, word);
break;
case 2:
printf("%d\n", words(v, word));
break;
case 3:
printf("%d\n", prefix(v, word));
break;
}
}
cleanup(v);
fclose(stdin);
fclose(stdout);
return SUCCESS;
}