Pagini recente » Cod sursa (job #901677) | Cod sursa (job #321299) | Cod sursa (job #971989) | Cod sursa (job #2232925) | Cod sursa (job #602101)
Cod sursa(job #602101)
#include <stdio.h>
#include <algorithm>
struct Trie {
int nr, nrfii;
Trie *fiu[30];
Trie()
{
nr=nrfii=0;
memset( fiu, 0, sizeof(fiu) );
}
};
Trie *T;
char s[30];
void add(Trie *nod, char *c)
{
if(*c == '\n')
{
nod->nr++;
return;
}
if(nod->fiu[*c-'a']==0)
{
nod->fiu[*c-'a']=new Trie;
nod->nrfii++;
}
add(nod->fiu[*c-'a'], c+1);
}
int del(Trie *nod, char *c)
{
if(*c == '\n')
nod->nr--;
else if( del ( nod->fiu[*c-'a'], c+1) )
{
nod->fiu[*c-'a']=0;
nod->nrfii--;
}
if( nod->nr == 0 && nod-> nrfii == 0 && nod != T )
{
delete nod; return 1;
}
return 0;
}
int ap(Trie *nod, char *c)
{
if(*c == '\n')
return nod->nr;
if( nod->fiu[*c-'a'] )
return ap(nod->fiu[*c-'a'],c+1);
return 0;
}
int pref(Trie *nod, char *c)
{
if(*c == '\n' || nod->fiu[*c-'a']==0)
return 0;
return 1+pref(nod->fiu[*c-'a'],c+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
T = new Trie;
fgets(s,sizeof(s),stdin);
while( !feof(stdin) )
{
switch( s[0] )
{
case '0': add(T,s+2); break;
case '1': del(T,s+2); break;
case '2': printf("%d\n",ap(T,s+2)); break;
case '3': printf("%d\n",pref(T,s+2)); break;
}
fgets(s,sizeof(s),stdin);
}
}