Pagini recente » Profil Blackb3rry | Cod sursa (job #3236486) | Cod sursa (job #3286059) | Cod sursa (job #1406152) | Cod sursa (job #485339)
Cod sursa(job #485339)
#include <cstdio>
#include <cstring>
const int sigma = 26;
struct nod{
int drum, nr;
nod *f[sigma];
nod()
{
drum = nr = 0;
memset(f, 0, sizeof(f));
}
};
char s[22];
int len;
void add(nod *r, int i)
{
++r->drum;
if (i == len)
{
++r->nr;
return;
}
int fiu = s[i] - 'a';
if (r->f[fiu] == NULL)
r->f[fiu] = new nod;
add(r->f[fiu], i + 1);
}
void erase(nod *r, int i)
{
if (i == len)
{
--r->nr;
if (r->drum == 0)
delete r;
return;
}
int fiu = s[i] - 'a';
nod *aux = r->f[fiu];
erase(aux, i + 1);
--aux->drum;
if (r->drum == 0)
delete r;
else if (aux->drum == 0)
r->f[fiu] = NULL;
}
int number(nod *r, int i)
{
if (i == len)
return r->nr;
int fiu = s[i] - 'a';
if (r->f[fiu] == NULL)
return 0;
return number(r->f[fiu], i + 1);
}
int prefix(nod *r, int i)
{
if (i == len)
return i;
int fiu = s[i] - 'a';
if (r->f[fiu] == NULL)
return i;
return prefix(r->f[fiu], i + 1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
nod *r = new nod;
while (!feof(stdin))
{
int q;
scanf("%d %s ", &q, s);
len = strlen(s);
if (q == 0)
add(r, 0);
if (q == 1)
erase(r, 0);
if (q == 2)
printf("%d\n", number(r, 0));
if (q == 3)
printf("%d\n", prefix(r, 0));
}
}