Pagini recente » Cod sursa (job #2867801) | Cod sursa (job #2874861) | Cod sursa (job #1201209) | Cod sursa (job #3000323) | Cod sursa (job #1977135)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define id (*s - 'a')
typedef struct nod
{
int nrf;
int cuv;
struct nod *fii[26];
} nod;
void insert(nod* trie, char *s)
{
if(*s == '\0')
{
trie->cuv++;
return;
}
if(!trie->fii[id])
{
trie->fii[id] = (nod*) malloc(sizeof(nod));
memset( trie->fii[id]->fii, 0, sizeof( trie->fii ) );
trie->fii[id]->cuv = 0;
trie->fii[id]->nrf = 0;
trie->nrf++;
}
insert(trie->fii[id],s+1);
}
int del(nod* trie, char *s, int k)
{
if(*s=='\0')
{
if(trie->cuv > 1)
{
trie->cuv--;
return 0;
}
else
{
free(trie);
return 1;
}
}
if(del(trie->fii[id],s+1,++k))
{
trie->nrf--;
trie->fii[id]=0;
}
if(trie->nrf==0 && trie->cuv==0 && k!=0)
{
free(trie);
return 1;
}
return 0;
}
int apar(nod* trie, char* s)
{
if(*s=='\0')
{
return trie->cuv;
}
return 0 + apar(trie->fii[id],s+1);
}
int pref(nod* trie, char* s)
{
if(*s == '\0' || !trie->fii[id]) return 0;
return 1 + pref(trie->fii[id],s+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int op,i;
char s[30];
nod *trie;
trie = (nod*) malloc(sizeof(nod));
memset( trie->fii, 0, sizeof( trie->fii ) );
trie->cuv = 0;
trie->nrf = 0;
while(scanf("%d%s",&op,s)==2)
{
switch(op)
{
case 0:
insert(trie,s);
break;
case 1:
i = del(trie,s,0);
break;
case 2:
printf("%d\n",apar(trie,s));
break;
case 3:
printf("%d\n",pref(trie,s));
break;
}
}
return 0;
}