Pagini recente » Cod sursa (job #811472) | Cod sursa (job #2546942) | Sandbox (cutiuţa cu năsip) | Cod sursa (job #1387422) | Cod sursa (job #775799)
Cod sursa(job #775799)
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct celula {
int valoare;
struct celula **adr;
} TCelula,*ACelula;
ACelula AlocCelula()
{
ACelula x = (ACelula)calloc(1,sizeof(TCelula));
if (!x) return NULL;
x->adr = (ACelula *)calloc(27,sizeof(ACelula));
if (!x->adr) return NULL;
return x;
}
ACelula Initializare()
{
ACelula x = AlocCelula();
if (!x) return NULL;
return x;
}
void Adauga(ACelula a,char sir[])
{
int i;
ACelula aux = a;
for (i=0;i<strlen(sir);i++)
if (aux->adr[sir[i]-'a'] == NULL) {aux->adr[sir[i]-'a'] = AlocCelula();aux = aux->adr[sir[i]-'a'];aux->valoare = 1;}
else {aux = aux->adr[sir[i]-'a'];aux->valoare++;}
}
int NrAparitii(ACelula a,char sir[])
{
int i;
ACelula aux = a;
for (i=0;i<strlen(sir);i++)
if (aux->adr[sir[i]-'a']==NULL) return 0;
else aux = aux->adr[sir[i]-'a'];
int nr=0;
for (i=0;i<27;i++)
if (aux->adr[i]) nr += aux->adr[i]->valoare;
if (aux->valoare==nr) return 0;
else return aux->valoare - nr;
}
void Sterge(ACelula ag,char sir[])
{
int i;
ACelula a = ag;
i = NrAparitii(ag,sir);
if (i==0) return;
for (i=0;i<strlen(sir);i++)
{
if (a->adr[sir[i]-'a']->valoare==1) {a->valoare--;a->adr[sir[i]-'a']=NULL;return;}
else {a->valoare--;a = a->adr[sir[i]-'a'];}
}
if (a) a->valoare--;
}
int LungimePrefix(ACelula a,char sir[])
{
int i=0,lung=0;
ACelula aux = a;
for (i=0;i<strlen(sir);i++)
if (aux->adr[sir[i]-'a']!=NULL) {lung++;aux = aux->adr[sir[i]-'a'];}
else return lung;
return lung;
}
void Rezolva(ACelula a)
{
int x;
char sir[21];
while (scanf("%i %s",&x,sir)==2)
switch(x) {
case 0: Adauga(a,sir);break;
case 1: Sterge(a,sir);break;
case 2: printf("%i\n",NrAparitii(a,sir));break;
case 3: printf("%i\n",LungimePrefix(a,sir));break;
}
}
int main()
{
ACelula a = Initializare();
freopen("trie.in","rt",stdin);
freopen("trie.out","wt",stdout);
Rezolva(a);
return 0;
}