Pagini recente » Cod sursa (job #256733) | Cod sursa (job #3263464) | Cod sursa (job #3203052) | Cod sursa (job #240971)
Cod sursa(job #240971)
#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;
}
void erase(trie *t, char *c)
{
if (*c=='\n')
{
t->cuv--;
if (t->cuv==0 && t->fii==0 && t!=T) delete t;
}
else
{
erase(t->L[*c-'a'],c+1);
if (t->L[*c-'a']==NULL) t->fii--;
if (t->cuv==0 && t->fii==0 && t!=T) delete t;
}
}
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;
}