Pagini recente » Cod sursa (job #2046690) | Cod sursa (job #890296) | Cod sursa (job #205505) | Cod sursa (job #221137) | Cod sursa (job #1165101)
#include <cstdio>
using namespace std;
class Trie{
public:
Trie *fii[26];
int nrf,cuv;
Trie()
{
for(int i = 0; i <= 25; ++i)fii[i] = 0;
nrf = cuv = 0;
}
void Insert(char *p)
{
if(!*p){++cuv;return;}
if(!fii[*p-'a']){
fii[*p-'a'] = new Trie;
++nrf;
}
fii[*p-'a']->Insert(p+1);
}
void Delete(char *p)
{
if(!*p){
cuv--;
return;
}
fii[*p-'a']->Delete(p+1);
if(fii[*p-'a']->cuv == 0 && fii[*p-'a']->nrf == 0)
{
delete fii[*p-'a'];
--nrf;
fii[*p-'a'] = 0;
}
}
int Count(char *p)
{
if(!*p){return cuv;}
if(!fii[*p-'a'])return 0;
return fii[*p-'a']->Count(p+1);
}
int Prefix(char *p)
{
if(!*p)return 0;
if(!fii[*p-'a'])return 0;
return 1 + fii[*p-'a']->Prefix(p+1);
}
}T;
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int op;
char cuv[25];
while(scanf("%d",&op)==1 && scanf("%s",cuv) == 1)
{
if(op == 0)T.Insert(cuv);
if(op == 1)T.Delete(cuv);
if(op == 2)printf("%d\n",T.Count(cuv));
if(op == 3)printf("%d\n",T.Prefix(cuv));
}
return 0;
}