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