Pagini recente » Cod sursa (job #2590987) | Borderou de evaluare (job #1036306) | Monitorul de evaluare | Cod sursa (job #536472) | Cod sursa (job #309600)
Cod sursa(job #309600)
# include <cstdio>
# include <string>
using namespace std;
# define FIN "trie.in"
# define FOUT "trie.out"
# define MAXLEN 30
struct Trie
{
int Ap, Ct;
Trie *Fiu[MAXLEN];
Trie()
{
Ap = Ct = 0;
memset(Fiu, 0, sizeof(Fiu));
}
} *Arb;
int Op, L;
char sir[MAXLEN];
void Add(Trie *P, int Ind)
{
if (Ind > L)
{
++P -> Ct;
return;
}
if (!P -> Fiu[sir[Ind] - 'a'])
{
++P -> Ap;
P -> Fiu[sir[Ind] - 'a'] = new Trie;
}
Add(P -> Fiu[sir[Ind] - 'a'], Ind + 1);
}
int Del(Trie *P, int Ind)
{
Trie *F;
if (Ind > L)
{
--P -> Ct;
if (!P -> Ct && !P -> Ap) return 1;
return 0;
}
if (Del(P -> Fiu[sir[Ind] - 'a'], Ind + 1))
{
--P -> Ap;
F = P -> Fiu[sir[Ind] - 'a'];
P -> Fiu[sir[Ind] - 'a'] = NULL;
delete (F);
if (!P -> Ap && !P -> Ct) return 1;
}
return 0;
}
void Print(Trie *P, int Ind)
{
if (Ind > L)
{
printf("%d\n", P -> Ct);
return;
}
if (!P -> Fiu[sir[Ind] - 'a'])
{
printf("0\n");
return;
}
Print(P -> Fiu[sir[Ind] - 'a'], Ind + 1);
}
void Prefix(Trie *P, int Ind)
{
if (Ind > L || !P -> Fiu[sir[Ind] - 'a'])
{
printf("%d\n", Ind - 1);
return;
}
Prefix(P -> Fiu[sir[Ind] - 'a'], Ind + 1);
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
Arb = new Trie;
for (; scanf("%d ", &Op) != EOF;)
{
gets(sir + 1); L = strlen(sir + 1);
if (Op == 0) Add(Arb, 1);
if (Op == 1) Del(Arb, 1);
if (Op == 2) Print(Arb, 1);
if (Op == 3) Prefix(Arb, 1);
}
return 0;
}