Pagini recente » clasament-arhiva-educationala | Cod sursa (job #3272908) | Cod sursa (job #3261361) | Cod sursa (job #636081) | Cod sursa (job #338992)
Cod sursa(job #338992)
#include <stdio.h>
#define cmax 25
#define lmax 27
struct trie
{
int nra; //numar de aparitii
trie *nod [lmax];
};
char *p;
trie *first;
trie * init ()
{
int i;
trie *aux=new trie;
aux->nra=0;
for (i=0; i <= 26; ++i)
aux->nod [i]=NULL;
return aux;
}
void f0 ()
{
trie *aux;
//fprintf(stderr, "%d\n", first->nra);
aux=first;
while ((*p) >= 'a' && (*p) <= 'z')
{
if (aux->nod [(*p)-'a'] == NULL)
{
aux->nod [(*p)-'a']=init ();
}
aux=aux->nod [(*p)-'a'];
++p;
// fprintf(stderr, "%c", (*p) );
}
//fprintf(stderr, "\nok!" );
++aux->nra;
}
bool exista (trie *ceva, int x)
{
int i;
for (i=0; i <= 26; ++i)
if (i != x && ceva->nod [i] != NULL)
return true;
return false;
}
void f1 ()
{
trie *aux, *tata [100005];
int num=0;
aux=first;
tata [++num]=first;
while ((*p) >= 'a' && (*p) <= 'z')
{
aux=aux->nod [(*p)-'a'];
tata [++num]=aux;
++p;
}
--aux->nra;
if (aux->nra != 0) return;
if (exista (tata [num], -1)) return;
do
{
--p;
delete tata [num];
tata [num-1]->nod [(*p)-'a']=NULL;
// fprintf(stderr, "num=%d\n",num );
} while ((num > 1) && (!exista (tata [--num], -1)));
}
int f2 ()
{
trie *aux;
aux=first;
while ((*p) >= 'a' && (*p) <= 'z')
{
if (aux->nod [(*p)-'a'] == NULL)
return 0;
aux=aux->nod [(*p)-'a'];
++p;
}
return aux->nra;
}
int f3 ()
{
trie *aux;
int i, nl=0, r=0;
aux=first;
while ((*p) >= 'a' && (*p) <= 'z')
{
++nl;
if (aux->nod [(*p)-'a'] == NULL)
return nl-1;
if (exista (aux, (*p)-'a')) r=nl;
aux=aux->nod [(*p)-'a'];
//fprintf(stderr, "(*p)=%c\n", (*p) );
++p;
}
// fprintf(stderr, "ok!" );
// for (i=0; i <= 26; ++i)
// if (aux->nod [i] != NULL)
// r=nl;
if (aux->nra || exista (aux, -1)) return nl;
return r;
}
int main ()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
char a [cmax+10];
first=init ();
while (gets (a) != NULL)
{
p=a+2;
if (a [0] == '0')
{
f0 ();
continue;
}
if (a [0] == '1')
{
f1 ();
continue;
}
if (a [0] == '2')
{
printf ("%d\n", f2 ());
continue;
}
printf ("%d\n", f3 ());
}
return 0;
}