Pagini recente » Cod sursa (job #332022) | Cod sursa (job #1783438) | Cod sursa (job #2966972) | Cod sursa (job #2722503) | Cod sursa (job #593843)
Cod sursa(job #593843)
#include <stdio.h>
#include <string.h>
int t;
char s[34];
struct Trie
{
Trie *fii[26];
int cnt, nrFii;
Trie()
{
cnt = nrFii = 0;
memset(fii, 0, sizeof(fii));
}
};
Trie *Root = new Trie;
void insert(Trie *T, char *s)
{
if (s[0] == '\0')
{
T->cnt++;
return ;
}
if (T->fii[s[0]-'a'] == NULL)
{
T->fii[s[0]-'a'] = new Trie;
T->nrFii++;
}
insert(T->fii[s[0]-'a'], s+1);
}
int del(Trie *T, char *s)
{
if (s[0] == '\0')
{
T->cnt--;
}
else if (del(T->fii[s[0]-'a'], s+1))
{
T->nrFii--;
T->fii[s[0]-'a'] = NULL;
}
if (T != Root && T->cnt == 0 && T->nrFii == 0)
{
delete T;
return 1;
}
return 0;
}
int find(Trie *T, char *s)
{
if (s[0] == '\0')
{
return T->cnt;
}
else if (T->fii[s[0]-'a'] == NULL)
{
return 0;
}
return find(T->fii[s[0]-'a'], s+1);
}
int prefix(Trie *T, char *s, int k)
{
if (s[0] == '\0')
return k;
else if (T->fii[s[0]-'a'] == 0)
{
return k;
}
return prefix(T->fii[s[0]-'a'], s+1, k+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
while(!feof(stdin))
{
memset(s, 0, sizeof(s));
scanf("%d %s\n", &t, s);
if (t == 0)
{
insert(Root, s);
}
else if (t == 1)
{
del(Root, s);
}
else if (t == 2)
{
printf("%d\n", find(Root, s));
}
else
{
printf("%d\n", prefix(Root, s, 0));
}
}
return 0;
}