Pagini recente » Cod sursa (job #2906498) | Cod sursa (job #1697966) | Cod sursa (job #738145) | Cod sursa (job #129714) | Cod sursa (job #526546)
Cod sursa(job #526546)
#include <algorithm>
using namespace std;
#define SIGMA 26
#define DIM 25
struct trie
{
int cnt,nrfii;
trie *fiu[SIGMA];
trie ()
{
cnt=nrfii=0;
memset (fiu,0,sizeof (fiu));
}
} *arb=new trie;
char buff[DIM];
int lg;
void insert (trie *nod,int poz)
{
if (poz>lg)
{
++nod->cnt;
return ;
}
if (!nod->fiu[buff[poz]-'a'])
{
nod->fiu[buff[poz]-'a']=new trie;
++nod->nrfii;
}
insert (nod->fiu[buff[poz]-'a'],poz+1);
}
int remove (trie *nod,int poz)
{
if (poz>lg)
--nod->cnt;
else if (remove (nod->fiu[buff[poz]-'a'],poz+1))
{
nod->fiu[buff[poz]-'a']=0;
--nod->nrfii;
}
if (!nod->cnt && !nod->nrfii && nod!=arb)
{
delete nod;
return 1;
}
return 0;
}
int query (trie *nod,int poz)
{
if (poz>lg)
return nod->cnt;
if (!nod->fiu[buff[poz]-'a'])
return 0;
return query (nod->fiu[buff[poz]-'a'],poz+1);
}
int prefix (trie *nod,int poz)
{
if (poz>lg || !nod->fiu[buff[poz]-'a'])
return 0;
return 1+prefix (nod->fiu[buff[poz]-'a'],poz+1);
}
int main ()
{
freopen ("trie.in","r",stdin);
freopen ("trie.out","w",stdout);
for (; fgets (buff+1,DIM,stdin); )
{
lg=strlen (buff+1)-(buff[strlen (buff+1)]=='\n');
if (buff[1]=='0')
insert (arb,3);
else if (buff[1]=='1')
remove (arb,3);
else if (buff[1]=='2')
printf ("%d\n",query (arb,3));
else
printf ("%d\n",prefix (arb,3));
}
return 0;
}