Pagini recente » Cod sursa (job #103827) | Cod sursa (job #1216191) | Cod sursa (job #2195712) | Cod sursa (job #1965025) | Cod sursa (job #233710)
Cod sursa(job #233710)
#include<stdio.h>
#include<string.h>
struct trie
{
int cnt,nrfii;
trie *fiu[26];
trie()
{
cnt=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *t=new trie;
void add(trie *nod,char *s)
{
if(*s=='\n')
{
nod->cnt++;
return;
}
int c=*s-'a';
if(nod->fiu[c]==0)
{
nod->fiu[c]=new trie;
nod->nrfii++;
}
add(nod->fiu[c],s+1);
}
bool del(trie *nod,char *s)
{
if(*s=='\n')
nod->cnt--;
else
if(del(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if(nod->cnt==0 && nod->nrfii==0 && nod!=t)
{
delete nod;
return true;
}
return false;
}
int numara(trie *nod,char *s)
{
if(*s=='\n')
return nod->cnt;
if(nod->fiu[*s-'a'])
return numara(nod->fiu[*s-'a'],s+1);
return 0;
}
int numara(trie *nod,char *s,int k)
{
if(*s=='\n')
return k;
if(nod->fiu[*s-'a']==0)
return k;
return numara(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char c[25];
fgets(c,25,stdin);
while(!feof(stdin))
{
if(c[0]=='0')
add(t,c+2);
else
if(c[0]=='1')
del(t,c+2);
else
if(c[0]=='2')
printf("%d\n",numara(t,c+2));
else
if(c[0]=='3')
printf("%d\n",numara(t,c+2,0));
fgets(c,25,stdin);
}
return 0;
}