Pagini recente » Cod sursa (job #1420725) | Cod sursa (job #2866114) | Cod sursa (job #2227277) | Cod sursa (job #1064915) | Cod sursa (job #603548)
Cod sursa(job #603548)
#include <stdio.h>
struct trie
{
int fii, cuvinte;
trie *fiu[26];
trie()
{
int i;
fii = 0;
cuvinte = 0;
for(i = 0; i<26; ++i)
{
fiu[i] = NULL;
}
}
} *rad = new trie;
void adauga(trie *nod, char *s)
{
trie *nou;
if(s[0] == '\n')
{
nod->cuvinte++;
return;
}
if(nod->fiu[s[0] - 'a'] == NULL)
{
nou = new trie();
nod->fiu[s[0] - 'a'] = nou;
nod->fii++;
}
adauga(nod->fiu[s[0] - 'a'], s+1);
}
int sterge(trie *nod, char *s)
{
if(s[0] == '\n')
{
nod->cuvinte--;
}
else
{
if(nod->fiu[s[0] - 'a'] && sterge(nod->fiu[s[0] - 'a'], s+1))
{
nod->fiu[s[0] - 'a'] = NULL;
nod->fii--;
}
}
if(nod->fii == 0 && nod->cuvinte == 0 && nod != rad)
{
delete nod;
return 1;
}
return 0;
}
int aparitii(trie *nod, char *s)
{
if(s[0] == '\n')
{
return nod->cuvinte;
}
if(nod->fiu[s[0] - 'a'])
{
return aparitii(nod->fiu[s[0] - 'a'], s+1);
}
return 0;
}
int prefix(trie *nod, char *s, int k)
{
if(s[0] == '\n' || nod->fiu[s[0] - 'a'] == NULL)
{
return k;
}
return prefix(nod->fiu[s[0] - 'a'], s+1, k+1);
}
int main()
{
char linie[32];
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
do
{
fgets(linie, 32, stdin);
switch(linie[0])
{
case '0': adauga(rad, linie+2); break;
case '1': sterge(rad, linie+2); break;
case '2': printf("%d\n", aparitii(rad, linie+2)); break;
case '3': printf("%d\n", prefix(rad, linie+2, 0)); break;
}
}
while(!feof(stdin));
return 0;
}