Pagini recente » Cod sursa (job #938761) | Cod sursa (job #2308237) | Cod sursa (job #2297040) | Cod sursa (job #2224646) | Cod sursa (job #2316153)
#include <cstdio>
using namespace std;
struct Trie{
Trie(){
counter=0;
nr_fii=0;
for(int i=0; i<26; ++i)
sons[i]=NULL;
}
int counter,nr_fii;
Trie* sons[26];
};
char s[30];
Trie *root=new Trie;
int lung;
void insert(Trie *nod, char* letter) {
if(*letter==0){
nod->counter++;
return;
}
if(nod->sons[*letter- 'a']==NULL){
nod->sons[*letter-'a']=new Trie;
nod->nr_fii++;
}
insert(nod->sons[*letter-'a'], letter+1);
}
bool erase(Trie *nod, char *letter)
{
if(*letter==0){
if(nod->counter>0){
nod->counter--;
}
}
else {
if(nod->sons[*letter-'a']==NULL)
return false;
if(erase(nod->sons[*letter-'a'], letter+1)) {
nod->nr_fii--;
nod->sons[*letter-'a']=NULL;
}
}
if(nod->nr_fii==0 && nod->counter==0 && nod!=root) {
delete nod;
return true;
}
return false;
}
int finder(Trie *nod, char *letter)
{
if(*letter==0)
return nod->counter;
if(nod->sons[*letter-'a']==NULL)
return 0;
return finder(nod->sons[*letter-'a'], letter+1);
}
int operatie(Trie *nod, char *letter)
{
if(*letter==0)
return lung;
if(nod->sons[*letter-'a']==NULL)
return lung;
else{
lung++;
return operatie(nod->sons[*letter-'a'], letter+1);
}
}
int main()
{ freopen("trie.in", "r",stdin);
freopen("trie.out", "w",stdout);
int op;
while(scanf("%d ", &op)==1){
scanf("%s", &s);
if(op==0)
insert(root, s);
else{
if(op==1)
erase(root, s);
else{
if(op==2)
printf("%d\n", finder(root, s));
else{
lung=0;
printf("%d\n", operatie(root, s));
}
}
}
}
return 0;
}