Pagini recente » Cod sursa (job #1834552) | Cod sursa (job #743653)
Cod sursa(job #743653)
#include <cstdio>
#include <cstring>
struct trie
{
int numcuv;
int numpre;
trie *a[26];
};
char primchar;
trie *trie_nou()
{
trie *tmp=new trie;
tmp->numcuv=tmp->numpre=0;
memset(tmp->a,NULL,sizeof(trie *)*26);
return tmp;
}
void adauga_cuv(trie *poz,char *cuv)
{
primchar=cuv[0];
if(primchar)
{
if(!poz->a[primchar-'a'])
poz->a[primchar-'a']=trie_nou();
cuv++;
poz->numpre++;
adauga_cuv(poz->a[primchar-'a'],cuv);
}
else
{
poz->numcuv++;
poz->numpre++;
}
}
int num_apar(trie *poz,char *cuv)
{
primchar=cuv[0];
if(primchar)
{
if(poz->a[primchar-'a'])
{
cuv++;
return num_apar(poz->a[primchar-'a'],cuv);
}
else
return 0;
}
else
return poz->numcuv;
}
int sterge_cuv(trie* poz,char *cuv)
{
char primchar=cuv[0];
if(primchar)
{
cuv++;
if(sterge_cuv(poz->a[primchar-'a'],cuv))
{
delete poz->a[primchar-'a'];
poz->a[primchar-'a']=NULL;
}
poz->numpre--;
return !poz->numcuv&&!poz->numpre;
}
else
{
poz->numcuv--;
poz->numpre--;
return !poz->numcuv&&!poz->numpre;
}
}
char lung_pref(trie *poz,char *cuv,char lung)
{
primchar=cuv[0];
if(primchar)
{
if(poz->a[primchar-'a'])
{
cuv++;
return lung_pref(poz->a[primchar-'a'],cuv,lung+1);
}
else
return lung;
}
else
return lung;
}
int main()
{
FILE *f=fopen("trie.in","r"),*g=fopen("trie.out","w");
char *a=new char[23];
int cod_op;
trie *trie=trie_nou();
while(!feof(f))
{
fgets(a,23,f);
cod_op=a[0]-'0';
a[strlen(a)-1]=NULL;
a+=2;
if(cod_op==0)
adauga_cuv(trie,a);
else if(cod_op==1)
sterge_cuv(trie,a);
else if(cod_op==2)
fprintf(g,"%d\n",num_apar(trie,a));
else if(cod_op==3)
fprintf(g,"%d\n",lung_pref(trie,a,0));
a-=2;
}
return 0;
}