Pagini recente » Cod sursa (job #516950) | Cod sursa (job #2263968) | Cod sursa (job #162805) | Cod sursa (job #797289) | Cod sursa (job #2227560)
#include <bits/stdc++.h>
using namespace std;
class Trie{
public:
Trie *fii[26];
int nrf;
int nrap;
Trie() {
memset(fii, 0, sizeof(fii));
nrf = nrap = 0;
}
void insert(char *c)
{
if (*c == 0) {
++nrap;
return;
}
if (fii[*c - 'a'] == 0) {
fii[*c - 'a'] = new Trie();
++nrf;
}
fii[*c - 'a']->insert(c + 1);
}
void erase(char *c)
{
if (*c == 0) {
--nrap;
return;
}
if (fii[*c - 'a'] == 0)
return;
fii[*c - 'a']->erase(c + 1);
if (fii[*c -'a']->nrf == 0) {
--nrf;
delete fii[*c - 'a'];
fii[*c - 'a'] = 0;
}
}
int count(char *c)
{
if (*c == 0)
return nrap;
if (fii[*c - 'a'] == 0)
return 0;
return fii[*c - 'a']->count(c + 1);
}
int prefix(char *c)
{
if (*c == 0)
return 0;
if (fii[*c - 'a'] == 0)
return 0;
return 1 + fii[*c - 'a']->prefix(c + 1);
}
};
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int op;
char s[30];
Trie trie;
while(scanf("%d %s", &op, &s) == 2)
{
switch(op) {
case 0: {trie.insert(s); break;}
case 1: {trie.erase(s); break;}
case 2: {printf("%d\n", trie.count(s)); break;}
case 3: {printf("%d\n", trie.prefix(s)); break;}
default: assert(1 == 0 && "Shouldn't have happened");
}
}
return 0;
}