Pagini recente » Cod sursa (job #201256) | Cod sursa (job #1239285) | Cod sursa (job #2211914) | Cod sursa (job #720200) | Cod sursa (job #2487161)
#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);
else
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[25];
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int t;
for(;cin>>t>>ws;)
{
fgets(s,22,stdin);
if ( t == 0 )
adaug ( prim, s );
else if ( t == 1 )
scoate ( prim, s );
else if ( t == 2 )
cout<<afiseaza ( prim, s )<<'\n';
else
cout<<prefix ( prim, s, 0)<<'\n';
}
return 0;
}