Pagini recente » Cod sursa (job #278016) | Cod sursa (job #927898) | Cod sursa (job #229908) | Cod sursa (job #2567354) | Cod sursa (job #743741)
Cod sursa(job #743741)
#include <stdio.h>
#include <string.h>
#define LMAX 31
char line[LMAX];
struct trie
{
int pass,end;
trie *fiu[LMAX];
trie()
{
memset(fiu,0,sizeof(fiu));
pass=end=0;
}
};
trie *T=new trie;
void insert(trie *nod,char *s)
{
nod->pass++;
if (*s=='\n')
{
nod->end++;
return ;
}
if (nod->fiu[*s-'a']==0)
nod->fiu[*s-'a']=new trie;
insert(nod->fiu[*s-'a'],s+1);
}
int erase(trie *nod,char *s)
{
nod->pass--;
if (*s=='\n')
nod->end--;
else
if (erase(nod->fiu[*s-'a'],s+1))
nod->fiu[*s-'a']=0;
if (nod!=T && nod->pass==0)
{
delete nod;
return 1;
}
return 0;
}
int count(trie *nod,char *s)
{
if (*s=='\n')
return nod->end;
if (nod->fiu[*s-'a']==0)
return 0;
return count(nod->fiu[*s-'a'],s+1);
}
int lcp(trie *nod,char *s,int how_much)
{
if (*s=='\n' || nod->fiu[*s-'a']==0)
return how_much;
return lcp(nod->fiu[*s-'a'],s+1,how_much+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(line+1,LMAX,stdin);
while (!feof(stdin))
{
switch (line[1])
{
case '0': insert(T,line+3); break ;
case '1': erase(T,line+3); break ;
case '2': printf("%d\n",count(T,line+3)); break ;
case '3': printf("%d\n",lcp(T,line+3,0)); break;
}
fgets(line+1,LMAX,stdin);
}
return 0;
}