Pagini recente » Cod sursa (job #252285) | Cod sursa (job #3262756) | Cod sursa (job #4270) | Cod sursa (job #247288) | Cod sursa (job #247721)
Cod sursa(job #247721)
#include <cstdio>
#include <cstring>
typedef struct noduri
{
int cuv,fii;
noduri *L[26];
noduri()
{
fii=cuv=0;
memset(L,0,sizeof(L));
}
} trie;
char w[21];
trie *T;
void insert(trie *t, char *c)
{
if (*c=='\n') t->cuv++;
else
{
int ch=*c-'a';
if (t->L[ch]==NULL)
{
t->L[ch]=new trie;
t->fii++;
}
insert(t->L[ch],c+1);
}
}
int count_words(trie *t, char *c)
{
if (*c=='\n') return t->cuv;
else
if (t->L[*c-'a']) return count_words(t->L[*c-'a'],c+1);
else return 0;
}
int count_prefix(trie *t, char *c)
{
if (*c=='\n' || t->L[*c-'a']==NULL || t->fii==0) return 0;
else
return count_prefix(t->L[*c-'a'],c+1)+1;
}
int erase(trie *t, char *c)
{
if (*c=='\n')
{
t->cuv--;
if (t->cuv==0 && t->fii==0 && t!=T)
{
delete t;
return 1;
}
else return 0;
}
else
{
if (erase(t->L[*c-'a'],c+1))
{
t->fii--;
t->L[*c-'a']=0;
}
if (t->cuv==0 && t->fii==0 && t!=T)
{
delete t;
return 1;
}
else return 0;
}
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
T=new trie;
fgets(w,21,stdin);
while (!feof(stdin))
{
switch (w[0])
{
case '0':insert(T,w+2); break;
case '1':erase(T,w+2); break;
case '2':printf("%d\n",count_words(T,w+2)); break;
case '3':printf("%d\n",count_prefix(T,w+2)); break;
}
fgets(w,21,stdin);
}
return 0;
}