Pagini recente » Cod sursa (job #2930347) | Cod sursa (job #2941611) | Cod sursa (job #273109) | Cod sursa (job #38934) | Cod sursa (job #390704)
Cod sursa(job #390704)
#include <cstdio>
#include <cstring>
const int sig = 26;
struct node{
int d, d2;
node *f[sig];
node()
{
d = d2 = 0;
memset(f, 0, sizeof(f));
}
};
char s[50];
int l;
void add(node *r, int x)
{
++r->d2;
if (x == l)
{
++r->d;
return;
}
int fiu = s[x] - 'a';
if (r->f[fiu] == NULL)
r->f[fiu] = new node;
add(r->f[fiu], x + 1);
}
void erase(node *r, int x)
{
if (x == l)
{
--r->d;
if (r->d2 == 0)
delete r;
return;
}
int fiu = s[x] - 'a';
node *aux = r;
r = r->f[fiu];
--r->d2;
if (aux->d2 == 0)
delete aux;
else if (r->d2 == 0)
aux->f[fiu] = NULL;
erase(r, x + 1);
}
int number(node *r, int x)
{
if (x == l)
return r->d;
int fiu = s[x] - 'a';
if (r->f[fiu] == NULL)
return 0;
return number(r->f[fiu], x + 1);
}
int prefix(node *r, int x)
{
if (x == l)
return l;
int fiu = s[x] - 'a';
if (r->f[fiu] == NULL)
return x;
return prefix(r->f[fiu], x + 1);
}
int main()
{
int q;
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
node *r = new node;
while (!feof(stdin))
{
scanf("%d %s ", &q, s);
l = 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));
}
}