Pagini recente » Cod sursa (job #1534515) | Cod sursa (job #2462495) | Cod sursa (job #1579238) | Cod sursa (job #2207974) | Cod sursa (job #955196)
Cod sursa(job #955196)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LMAX 26
char word[LMAX];
typedef struct trie_node
{
struct trie_node *children[LMAX];
int pass, end;
} trie;
trie *create_new_node()
{
trie *new_node = malloc(sizeof(trie));
new_node -> pass = new_node -> end = 0;
int i;
for (i = 0; i < LMAX; i++)
new_node -> children[i] = NULL;
return new_node;
}
trie *root;
void insert(trie *node, char *s)
{
node -> pass++;
if (*s == '\0')
{
node -> end++;
return ;
}
if (node -> children[*s - 'a'] == NULL)
node -> children[*s - 'a'] = create_new_node();
insert(node -> children[*s - 'a'], s + 1);
}
int count(trie *node, char *s)
{
if (*s == '\0')
return node -> end;
if (node -> children[*s - 'a'] == NULL)
return 0;
return count(node -> children[*s - 'a'], s + 1);
}
void delete_node(trie *node)
{
free(node);
}
int delete(trie *node, char *s)
{
node -> pass--;
if (*s == '\0')
{
if (node -> pass == 0)
{
delete_node(node);
return 1;
}
return 0;
}
if (delete(node -> children[*s - 'a'], s + 1))
node -> children[*s - 'a'] = NULL;
if (node -> pass == 0)
{
delete_node(node);
return 1;
}
return 0;
}
int lcp_any(trie *node, char *s)
{
if (*s == '\0')
return 0;
if (node -> children[*s - 'a'] != NULL)
return 1 + lcp_any(node -> children[*s - 'a'], s + 1);
return 0;
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
root = create_new_node();
int type;
while (!feof(stdin))
{
scanf("%d%s\n", &type, word);
switch (type)
{
case 0:
insert(root, word);
break ;
case 1:
delete(root, word);
break ;
case 2:
printf("%d\n", count(root, word));
break ;
case 3:
printf("%d\n", lcp_any(root, word));
break ;
}
}
return 0;
}