Pagini recente » Cod sursa (job #1256230) | Cod sursa (job #642087) | Cod sursa (job #1255691) | Cod sursa (job #348780) | Cod sursa (job #593385)
Cod sursa(job #593385)
#include <stdio.h>
#include <string.h>
#define HMAX 31
char line[HMAX];
struct trie
{
int cnt,nr;
trie *fiu[HMAX];
trie()
{
cnt=nr=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *T=new trie;
void ins(trie *nod,char *s)
{
nod->cnt++;
if (*s=='\n')
{
nod->nr++;
return ;
}
if (nod->fiu[*s-'a']==0)
nod->fiu[*s-'a']=new trie;
ins(nod->fiu[*s-'a'],s+1);
}
int del(trie *nod,char *s)
{
nod->cnt--;
if (*s=='\n')
nod->nr--;
else
if (del(nod->fiu[*s-'a'],s+1))
nod->fiu[*s-'a']=0;
if (nod->cnt==0 && nod->nr==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int numara(trie *nod,char *s)
{
if (*s=='\n')
return nod->nr;
if (nod->fiu[*s-'a']==0)
return 0;
return numara(nod->fiu[*s-'a'],s+1);
}
int common(trie *nod,char *s,int rez)
{
if (nod->fiu[*s-'a']==0 || *s=='\n')
return rez;
return common(nod->fiu[*s-'a'],s+1,rez+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(line+1,HMAX,stdin);
while (!feof(stdin))
{
switch (line[1])
{
case '0': ins(T,line+3); break ;
case '1': del(T,line+3); break ;
case '2': printf("%d\n",numara(T,line+3)); break ;
case '3': printf("%d\n",common(T,line+3,0)); break ;
}
fgets(line+1,HMAX,stdin);
}
return 0;
}