Pagini recente » Cod sursa (job #1845849) | Cod sursa (job #2224364) | Statistici Ioan Andrei (MadAndrei) | Cod sursa (job #325631) | Cod sursa (job #415314)
Cod sursa(job #415314)
#include <algorithm>
using namespace std;
#define SIGMA 26
char buff[SIGMA];
struct trie
{
trie *fiu[SIGMA];
int cnt,nrfii;
trie ()
{
cnt=nrfii=0;
memset (fiu,0,sizeof (fiu));
}
} *arb=new trie;
void ins (trie *nod,char *sir)
{
if (*sir=='\n')
{
++nod->cnt;
return ;
}
if (!nod->fiu[*sir-'a'])
{
nod->fiu[*sir-'a']=new trie;
++nod->nrfii;
}
ins (nod->fiu[*sir-'a'],sir+1);
}
bool del (trie *nod,char *sir)
{
if (*sir=='\n')
--nod->cnt;
else if (del (nod->fiu[*sir-'a'],sir+1))
{
nod->fiu[*sir-'a']=0;
--nod->nrfii;
}
if (!nod->cnt && !nod->nrfii && nod!=arb)
{
delete nod;
return 1;
}
return 0;
}
int query (trie *nod,char *sir)
{
if (*sir=='\n')
return nod->cnt;
if (nod->fiu[*sir-'a'])
return query (nod->fiu[*sir-'a'],sir+1);
return 0;
}
int prefix (trie *nod,char *sir,int nrt)
{
if (*sir=='\n' || !nod->fiu[*sir-'a'])
return nrt;
return prefix (nod->fiu[*sir-'a'],sir+1,nrt+1);
}
void read_solve ()
{
int i;
for (i=1; fgets (buff,SIGMA,stdin); ++i)
{
if (buff[0]=='0')
ins (arb,buff+2);
if (buff[0]=='1')
del (arb,buff+2);
if (buff[0]=='2')
printf ("%d\n",query (arb,buff+2));
if (buff[0]=='3')
printf ("%d\n",prefix (arb,buff+2,0));
}
}
int main ()
{
freopen ("trie.in","r",stdin);
freopen ("trie.out","w",stdout);
read_solve ();
return 0;
}