Pagini recente » Cod sursa (job #649453) | Cod sursa (job #2311638) | Cod sursa (job #91204) | Cod sursa (job #3237635) | Cod sursa (job #471965)
Cod sursa(job #471965)
#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(line, 32, stdin);
}
return 0;
}