Pagini recente » Cod sursa (job #1503751) | Cod sursa (job #1496003) | Cod sursa (job #1371198) | Cod sursa (job #566460) | Cod sursa (job #1366433)
#include <cstdio>
#define lit *p - 'a'
using namespace std;
class Trie{
private:
Trie *fii[26];
int nrfii,cuv;
public:
Trie(){
for(int i = 0; i <= 25; ++i)
fii[i] = NULL;
nrfii = cuv = 0;
}
void Insert(char *p){
if(!*p){
++cuv;
return;
}
if(fii[lit] == NULL){
fii[lit] = new Trie;
++nrfii;
}
fii[lit]->Insert(p+1);
}
void Delete(char *p){
if(!*p){
--cuv;
return;
}
fii[lit]->Delete(p+1);
if(fii[lit]->nrfii == 0 && fii[lit]->cuv == 0){
delete fii[lit];
--nrfii;
fii[lit] = 0;
}
}
int Count(char *p){
if(!*p) return cuv;
if(!fii[lit]) return 0;
return fii[lit]->Count(p+1);
}
int Prefix(char *p){
if(!*p || !fii[lit]) return 0;
return 1 + fii[lit]->Prefix(p+1);
}
};
Trie T;
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int t;
char w[25];
while(scanf("%d%s",&t,w) == 2)
{
if(t == 0)
T.Insert(w);
else
if(t == 1)
T.Delete(w);
else
if(t == 2)
printf("%d\n",T.Count(w));
else
printf("%d\n",T.Prefix(w));
}
return 0;
}