Pagini recente » Cod sursa (job #882276) | Cod sursa (job #237837) | Cod sursa (job #3194986) | Cod sursa (job #863667) | Cod sursa (job #2075153)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
int sf=0,nrfii=0;
Trie *fiu[26];
Trie()
{
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *T = new Trie;
void Adaugare (Trie *nod, char *s)
{
if (*s=='\n')
{
nod->sf++;
return;
}
if (nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a'] = new Trie;
nod->nrfii++;
}
Adaugare(nod->fiu[*s-'a'],s+1);
}
bool Stergere (Trie *nod, char *s)
{
if (*s=='\n')
{
nod->sf--;
}
else if (Stergere(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if (nod!=T && nod->nrfii==0 && nod->sf==0)
{
delete nod;
return 1;
}
return 0;
}
int NrApp(Trie *nod,char *s)
{
if (*s=='\n')
return nod->sf;
if (nod->fiu[*s-'a'])
return NrApp(nod->fiu[*s-'a'],s+1);
return 0;
}
int Prefix (Trie *nod, char *s, int depth=0)
{
if (*s=='\n' || nod->fiu[*s-'a']==0)
return depth;
return Prefix(nod->fiu[*s-'a'],s+1,depth+1);
}
int main()
{
freopen ("trie.in","r",stdin);
freopen ("trie.out","w",stdout);
char a[32];
fgets( a, 32, stdin );
while( !feof( stdin ) ) {
switch( a[0] ) {
case '0': Adaugare( T, a+2 ); break;
case '1': Stergere( T, a+2 ); break;
case '2': cout<<NrApp( T, a+2)<<endl; break;
case '3': cout<<Prefix( T, a+2)<<endl; break;
}
fgets( a, 32, stdin );
}
return 0;
}