Pagini recente » Cod sursa (job #1136577) | Cod sursa (job #2069732) | Cod sursa (job #2487265) | Cod sursa (job #2438948) | Cod sursa (job #1210239)
#include <cstdio>
#include <cstring>
#define ch (*c - 'a')
using namespace std;
struct trie
{
int nr,n;
trie *p[26];
trie()
{
nr=n=0;
memset(p , 0 , sizeof(p));
}
};
trie *t = new trie;
void adauga(trie *nod,char *c)
{
if (*c == '\n')
{
nod->n++;return;
}
if (nod->p[ch] == 0)
{
nod->p[ch] = new trie;
nod->nr++;
}
adauga(nod->p[ch],c+1);
}
int sterge(trie *nod,char *c)
{
if (*c == '\n')
nod->n--;
else
if (sterge(nod->p[ch],c+1))
{
nod->p[ch] = 0;
nod->nr--;
}
if (nod->n == 0 && nod->nr == 0 && nod != t)
{
delete nod;
return 1;
}
return 0;
}
int word(trie *nod,char *c)
{
if (*c == '\n')
return nod->n;
if (nod->p[ch])
return word(nod->p[ch],c+1);
return 0;
}
int pre(trie *nod,char *c,int k)
{
if (*c == '\n' || nod->p[ch] == 0)
return k;
return pre(nod->p[ch],c+1,k+1);
}
int main()
{
char line[32];
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(line,32,stdin);
while (!feof(stdin))
{
if (line[0] == '0')
adauga(t,line+2);
else
if (line[0] == '1')
sterge(t,line+2);
else
if (line[0] == '2')
printf("%d\n",word(t,line+2));
else
if (line[0] == '3')
printf("%d\n",pre(t,line+2,0));
fgets(line,32,stdin);
}
return 0;
}