Pagini recente » Cod sursa (job #1740675) | Cod sursa (job #1618651) | Cod sursa (job #3217617) | Cod sursa (job #2182585) | Cod sursa (job #1875044)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
int nr, lv;
Trie* v[26];
Trie()
{
nr = 0; lv = 0;
memset(v, 0, sizeof(v));
}
} root;
void add(Trie* t, char* s)
{
if(*s == 0) t->nr++;
else
{
if(t->v[*s - 'a'] == 0)
{
t->v[*s - 'a'] = new Trie();
t->lv++;
}
add(t->v[*s - 'a'], s + 1);
}
}
void del(Trie* t, char* s)
{
if(*s == 0)
t->nr--;
else
{
del(t->v[*s - 'a'], s + 1);
if(t->v[*s - 'a']->nr == 0 && t->v[*s - 'a']->lv == 0)
{
delete t->v[*s - 'a'];
t->v[*s - 'a'] = 0;
t->lv--;
}
}
}
int q2(Trie* t, char* s)
{
if(*s == 0) return t->nr;
if(t->v[*s - 'a'] != 0)
return q2(t->v[*s - 'a'], s + 1);
return 0;
}
int q3(Trie* t, char* s, int k)
{
if(*s == 0) return k;
if(t->v[*s - 'a'] != 0)
q3(t->v[*s - 'a'], s + 1, k + 1);
else return k;
}
char cuv[22];
int com;
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
while(true)
{
scanf("%d %s", &com, cuv);
if(feof(stdin))
break;
switch(com)
{
case 0:
add(&root, cuv);
break;
case 1:
del(&root, cuv);
break;
case 2:
printf("%d\n", q2(&root, cuv));
break;
case 3:
printf("%d\n", q3(&root, cuv, 0));
break;
}
}
return 0;
}