Pagini recente » Cod sursa (job #1738803) | Cod sursa (job #202887) | Cod sursa (job #3223016) | Cod sursa (job #1645809) | Cod sursa (job #2487162)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct Trie
{
int cnt,nrfii;
Trie *fiu[26];
Trie()
{
nrfii = cnt = 0;
memset ( fiu, 0, sizeof ( fiu ) );
}
};
Trie *prim=new Trie;
void adaug ( Trie *nod, char *s )
{
if(*s=='\n')
{
nod->cnt++;
return;
}
else if(nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a']=new Trie;
nod->nrfii++;
}
adaug(nod->fiu[*s-'a'],s+1);
}
bool scoate ( Trie *nod, char *s )
{
if(*s=='\n')
nod->cnt--;
else if(scoate(nod->fiu[*s-'a'],s+1))
{
nod->nrfii--;
nod->fiu[*s-'a']=0;
}
if(nod->nrfii==0&&nod->cnt==0&&nod!=prim)
{
delete nod;
return 1;
}
return 0;
}
int afiseaza ( Trie *nod, char *s )
{
if(*s=='\n')
return nod->cnt;
else if(nod->fiu[*s-'a'])
afiseaza(nod->fiu[*s-'a'],s+1);
return 0;
}
int prefix ( Trie *nod, char *s, int max1 )
{
if(*s=='\n'||nod->fiu[*s-'a']==0)
return max1;
return prefix(nod->fiu[*s-'a'],s+1, max1+1);
}
char s[30];
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(s,30,stdin);
while(!feof(stdin))
{
if ( s[0] == '0' )
adaug ( prim, s+2 );
else if ( s[0] == '1' )
scoate ( prim, s+2 );
else if ( s[0] == '2' )
cout<<afiseaza ( prim, s+2 )<<'\n';
else
cout<<prefix ( prim, s+2, 0)<<'\n';
fgets(s,30,stdin);
}
return 0;
}