Pagini recente » Cod sursa (job #2237456) | Cod sursa (job #1219661) | Cod sursa (job #1869448) | Cod sursa (job #3192666) | Cod sursa (job #482154)
Cod sursa(job #482154)
#include <cstdio>
#include <cstring>
#define x (*s)-'a'
struct Trie
{
int nrfii, nra;
Trie *f [26];
Trie ()
{
nrfii=nra=0;
memset (f, 0, sizeof (f));
}
};
Trie *t=new Trie;
void ins (Trie *k, char *s)
{
if (*s == '\n') {++k->nra; return;}
if (k->f [x] == 0) {k->f [x]=new Trie; ++k->nrfii;}
ins (k->f [x], s+1);
}
int del (Trie *k, char *s)
{
if (*s == '\n') --k->nra;
else if (del (k->f [x], s+1)) {--k->nrfii; k->f [x]=0;}
if (k->nra == 0 && k->nrfii == 0 && k != t) return 1;
return 0;
}
int nrap (Trie *k, char *s)
{
if (*s == '\n') return k->nra;
if (k->f [x] == 0) return 0;
return nrap (k->f [x], s+1);
}
int pmax (Trie *k, char *s, int w)
{
if (*s == '\n' || k->f [x] == 0) return w;
return pmax (k->f [x], s+1, w+1);
}
int main ()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
char s [30];
while (fgets (s, 105, stdin) != NULL)
{
switch (s [0])
{
case '0': ins (t, s+2); break;
case '1': del (t, s+2); break;
case '2': printf ("%d\n", nrap (t, s+2)); break;
case '3': printf ("%d\n", pmax (t, s+2, 0)); break;
}
}
return 0;
}