Pagini recente » Cod sursa (job #2263072) | Cod sursa (job #713579) | Cod sursa (job #1108950) | Cod sursa (job #1734093) | Cod sursa (job #1786983)
#include <bits/stdc++.h>
#define SIGMA 27
FILE *fin = freopen("trie.in", "r", stdin);
FILE *fout = freopen("trie.out", "w", stdout);
using namespace std;
char word[25];
struct Node
{
Node *son[SIGMA];
int app_w;
int app_p;
};
Node *new_empty_node()
{
Node *node = new Node;
for(int i = 0; i < SIGMA; ++ i)
node->son[i] = NULL;
node->app_w = 0;
node->app_p = 0;
}
void insert_w(Node *node, char *word)
{
if(word[0] == 0)
{
node->app_w ++;
return;
}
if(node->son[word[0] - 'a'] == NULL)
node->son[word[0] - 'a'] = new_empty_node();
node = node->son[word[0] - 'a'];
node->app_p ++;
insert_w(node, word + 1);
}
void erase_w(Node *node, char *word)
{
if(word[0] == 0)
{
node->app_w --;
return;
}
node = node->son[word[0] - 'a'];
if(node->app_p > 0)
node->app_p --;
erase_w(node, word + 1);
}
int nr_appearance(Node *node, char *word)
{
if(word[0] == 0)
return node->app_w;
if(node->son[word[0] - 'a'] != NULL)
nr_appearance(node->son[word[0] - 'a'], word + 1);
else return 0;
}
int lenght_prefix(Node *node, char *word, int depth)
{
if(word[0] == 0)
return depth;
node = node->son[word[0] - 'a'];
if(node != NULL && node->app_p > 0)
lenght_prefix(node, word + 1, depth + 1);
else
return depth;
}
int main()
{
int c;
Node *root = new_empty_node();
while(scanf("%d ", &c) != EOF)
{
gets(word);
if(c == 0)
insert_w(root, word);
if(c == 1)
erase_w(root, word);
if(c == 2)
printf("%d\n", nr_appearance(root, word));
if(c == 3)
printf("%d\n", lenght_prefix(root, word, 0));
}
return 0;
}