Pagini recente » Cod sursa (job #2508899) | Cod sursa (job #360490) | Cod sursa (job #1500797) | Cod sursa (job #355450) | Cod sursa (job #996187)
Cod sursa(job #996187)
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int ALPH = 26;
struct trie_node {
int key, son_nr;
trie_node *son[ALPH];
trie_node () {
key = son_nr = 0;
for (int i = 0; i < ALPH; ++i)
son[i] = 0;
}
};
trie_node *root = new trie_node ();
int r;
void TRIE_push (char *s) {
trie_node *current = root;
for (; *s; ++s) {
if (!current->son[*s - 'a'])
current->son[*s - 'a'] = new trie_node (),
current->son_nr++;
current = current->son[*s - 'a'];
}
current->key++;
}
void TRIE_pop (char *s, trie_node *current) {
if (!*s) {
current->key--;
return;
}
TRIE_pop (s + 1, current->son[*s - 'a']);
if (!current->son[*s - 'a']->key && !current->son[*s - 'a']->son_nr)
delete current->son[*s - 'a'],
current->son[*s - 'a'] = 0,
current->son_nr--;
}
int TRIE_query (char *s) {
trie_node *current = root;
for (; *s && current; ++s)
current = current->son[*s - 'a'];
if (!current)
return 0;
return current->key;
}
void TRIE_prefix (char *s) {
trie_node *current = root;
for (; *s && current; ++s, ++r)
current = current->son[*s - 'a'];
if (!current)
--r;
}
int main () {
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
char S[25];
fgets (S, 25, stdin);
while (!feof (stdin)) {
switch (S[0] - '0') {
case 0:
TRIE_push (S + 2);
break;
case 1:
TRIE_pop (S + 2, root);
break;
case 2:
cout << TRIE_query (S + 2) << '\n';
break;
default:
r = 0;
TRIE_prefix (S + 2);
printf ("%d\n", r);
}
fgets (S, 25, stdin);
}
}