Pagini recente » Cod sursa (job #1796003) | Cod sursa (job #651153) | Cod sursa (job #2291009) | Cod sursa (job #2826481) | Cod sursa (job #2490007)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
int nr=0;
int nrchild=0;
trie *child[27]={};
};
trie* T = new trie;
int lg;
char s[30];
void Add(trie*, char *);
void Del(trie*, char *);
int Cnt(trie*, char *);
void Lg(trie*, char *);
int main(){
short task;
while(fin>>task>>s){
switch(task){
case 0:
Add(T, s);
break;
case 1:
Del(T, s);
break;
case 2:
fout<<Cnt(T, s)<<'\n';
break;
case 3:
lg=0;
Lg(T,s);
fout<<lg<<'\n';
break;
}
}
return 0;
}
void Lg(trie* t, char *it){
char ch=*it-'a';
if(*it==NULL || t->child[ch] == false)
return;
++lg;
Lg(t->child[ch], it+1);
}
int Cnt(trie* t, char *it){
char ch=*it-'a';
if(*it==NULL)
return t->nr;
if(t->child[ch] == false)
return 0;
return Cnt(t->child[ch], it+1);
}
void Del(trie* t, char *it){
if(*it==NULL){
--t->nr;
return;
}
char ch=*it-'a';
Del(t->child[ch], it+1);
if(t->child[ch]->nrchild == 0 && t->child[ch]->nr == 0){
--(t->nrchild);
delete t->child[ch];
t->child[ch]=0;
}
}
void Add(trie* t, char *it){
if(*it==NULL){
++t->nr;
return;
}
char ch=*it-'a';
if(t->child[ch] == false){
t->child[ch]= new trie;
++t->nrchild;
}
Add(t->child[ch], it+1);
}