Pagini recente » Cod sursa (job #2804473) | Cod sursa (job #1707542) | Cod sursa (job #1567813) | Cod sursa (job #2480510) | Cod sursa (job #1875071)
#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 != '\n')
{
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 == '\n')
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 != '\n')
{
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 != '\n')
{
if(t->v[*s - 'a'] == 0)
return k;
t = t->v[*s - 'a'];
s++;
k++;
}
return k;
}
char cuv[32];
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
root = &v[0];
fgets(cuv, 30, stdin);
while(!feof(stdin))
{
switch(cuv[0])
{
case '0':
add(root, cuv + 2);
break;
case '1':
del(root, cuv + 2);
break;
case '2':
printf("%d\n", q2(root, cuv + 2));
break;
case '3':
printf("%d\n", q3(root, cuv + 2, 0));
break;
}
fgets(cuv, 30, stdin);
}
return 0;
}