Pagini recente » Cod sursa (job #375275) | Cod sursa (job #471957)
Cod sursa(job #471957)
#include <cstdio>
#include <string.h>
struct Trie {
int cnt, nrch;
Trie *child[26];
Trie(){
cnt = nrch = 0;
memset(child, 0, sizeof(child));
}
};
Trie *T = new Trie;
void ins(Trie *node, char *c){
if(*c == '\n'){
node->cnt++; return;
}
if(node->child[*c-'a'] == 0){
node->child[*c-'a'] = new Trie;
node->nrch++;
}
ins(node->child[*c-'a'], c+1);
}
int del(Trie *node, char *c){
if(*c == '\n')
node->cnt--;
else if(del(node->child[*c-'a'], c+1)){
node->child[*c-'a'] = 0;
node->nrch--;
}
if(node->cnt == 0 && node->nrch == 0 && node != T)
delete node; return 1;
return 0;
}
int query(Trie *node, char *c){
if(*c == '\n')
return node->cnt;
if(node->child[*c-'a'])
return query(node->child[*c-'a'], c+1);
return 0;
}
int prefix(Trie *node, char *c, int n){
if(*c == '\n' || node->child[*c-'a'] == 0)
return n;
return prefix(node->child[*c-'a'], c+1, n+1);
}
int main(){
freopen("trie.in", "r", stdin);
//freopen("trie.out", "w", stdout);
char line[32];
fgets(line, 32, stdin);
while(!feof(stdin)){
if(line[0] == 0)
ins(T, line+2);
else if(line[0] == 1)
del(T, line+2);
else if(line[0] == 2)
printf("%d\n", query(T, line+2));
else if(line[0] == 3)
printf("%d\n", prefix(T, line+2, 0));
fgets();
}
return 0;
}