Pagini recente » Cod sursa (job #2331622) | Cod sursa (job #3129661) | Cod sursa (job #2822526) | Cod sursa (job #2236938) | Cod sursa (job #1645777)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie{
int nr, nf;
Trie *Sons[26];
Trie(){
nr = nf = 0;
memset(Sons, 0, sizeof(Sons));
}
};
Trie *Nod = new Trie;
void add(Trie *T, char *s){
if(*s == 0)
++T->nr;
else
if(T->Sons[*s - 'a'] == 0){
T->Sons[*s - 'a'] = new Trie;
++T->nf;
add(T->Sons[*s - 'a'], s + 1);
}
else
add(T->Sons[*s - 'a'], s + 1);
}
int query(Trie *T, char *s){
if(*s == 0)
return T->nr;
else
if(T->Sons[*s - 'a'])
return query(T->Sons[*s - 'a'], s + 1);
return 0;
}
int del(Trie *T,char *s){
if(*s == 0)
--T->nr;
else
if(del(T->Sons[*s - 'a'], s + 1)){
T->Sons[*s - 'a'] = 0;
--T->nf;
}
if(T->nr == 0 && T->nf == 0 && T != Nod){
delete T;
return 1;
}
return 0;
}
int solve(Trie *T,char *s){
if(*s == 0 || T->Sons[*s - 'a'] == 0)
return 0;
else
return 1 + solve(T->Sons[*s - 'a'], s + 1);
}
int main(){
char s[37];
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
while(gets(s)){
if(s[0] == '0')
add(Nod, s + 2);
if(s[0] == '1')
del(Nod, s + 2);
if(s[0] == '2')
printf("%d\n", query(Nod, s + 2));
if(s[0] == '3')
printf("%d\n", solve(Nod, s + 2));
}
return 0;
}