Pagini recente » Cod sursa (job #1975169) | Cod sursa (job #1109273) | Cod sursa (job #585711) | Cod sursa (job #2558721) | Cod sursa (job #1875062)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
int nr, lv;
Trie* v[26];
} v[200001 * 26], *root;
int lv = 1;
void add(Trie* t, char* s)
{
while(*s)
{
if(t->v[*s - 'a'] == 0)
{
t->v[*s - 'a'] = &v[lv++];
t->lv++;
}
t = t->v[*s - 'a'];
s++;
}
t->nr++;
}
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)
{
t->v[*s - 'a'] = 0;
t->lv--;
}
}
}
int q2(Trie* t, char* s)
{
while(*s)
{
if(t->v[*s - 'a'] == 0)
return 0;
t = t->v[*s - 'a'];
s++;
}
return t->nr;
}
int q3(Trie* t, char* s, int k)
{
while(*s)
{
if(t->v[*s - 'a'] == 0)
return k;
t = t->v[*s - 'a'];
s++;
k++;
}
return k;
}
char cuv[22];
int com;
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
root = &v[0];
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;
}