Pagini recente » Cod sursa (job #1007149) | Cod sursa (job #1557839) | Cod sursa (job #2837596) | Cod sursa (job #1695833) | Cod sursa (job #339111)
Cod sursa(job #339111)
#include <stdio.h>
#include <string.h>
struct Trie
{
int nrfii, nra;
Trie *fiu [27];
Trie ()
{
nrfii=nra=0;
memset (fiu, 0, sizeof (fiu));
}
};
Trie *t=new Trie;
void f0 (Trie *k, char *p)
{
if ((*p) == '\n')
++k->nra;
else
{
if (k->fiu [(*p)-'a'] == 0)
{
k->fiu [(*p)-'a']=new Trie;
++k->nrfii;
}
f0 (k->fiu [(*p)-'a'], p+1);
}
}
int f1 (Trie *k, char *p)
{
if ((*p) == '\n')
--k->nra;
else
if (f1 (k->fiu [(*p)-'a'], p+1))
{
--k->nrfii;
k->fiu [(*p)-'a']=0;
}
if (k->nrfii == 0 && k->nra == 0 && k != t)
{
delete k;
return 1;
}
return 0;
}
int f2 (Trie *k, char *p)
{
if ((*p) == '\n')
return k->nra;
if (k->fiu [(*p)-'a'] == 0)
return 0;
return f2 (k->fiu [(*p)-'a'], p+1);
}
int f3 (Trie *k, char *p, int pref)
{
if ((*p) == '\n' || k->fiu [(*p)-'a'] == 0)
return pref;
return f3 (k->fiu [(*p)-'a'], p+1, pref+1);
}
int main ()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
char a [65];
fgets (a, sizeof (a), stdin);
while (!feof (stdin))
{
switch (a [0])
{
case '0': f0 (t, a+2); break;
case '1': f1 (t, a+2); break;
case '2': printf ("%d\n", f2 (t, a+2)); break;
case '3': printf ("%d\n", f3 (t, a+2, 0)); break;
}
fgets (a, sizeof (a), stdin);
}
return 0;
}