Pagini recente » Cod sursa (job #2223816) | Cod sursa (job #1432697) | Clasament oni_11_12_11 | Clasamentul arhivei Infoarena Monthly | Cod sursa (job #2668104)
#include <bits/stdc++.h>
using namespace std;
class Node {
public:
Node *childs[int('z' - 'a' + 1)];
int cnt;
bool end;
Node() {
memset(this, 0, sizeof(Node));
}
} *root = new Node;
void add(const char * word) {
Node* node = root;
while (*word) {
if (node->childs[(*word) - 'a']) {
node = node->childs[(*word) - 'a'];
} else {
node = (node->childs[(*word) - 'a'] = new Node);
}
node->cnt++;
word++;
}
node->end = 1;
}
void del(const char * word) {
Node* node = root;
while (*word) {
if (node->childs[(*word) - 'a']) {
node = node->childs[(*word) - 'a'];
} else return;
word++;
node->cnt--;
}
}
int acc(const char * word) {
Node* node = root;
while (*word) {
if (node->childs[(*word) - 'a']) {
node = node->childs[(*word) - 'a'];
} else return 0;
word++;
}
return node->end ? node->cnt : 0;
}
int len(const char * word) {
Node* node = root;
int cnt = 0;
while (*word) {
if (node->childs[(*word) - 'a'] && node->childs[(*word) - 'a']->cnt) {
node = node->childs[(*word) - 'a'];
cnt++;
} else break;
word++;
}
return cnt;
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int op;
char word[21];
while(scanf("%d %21s", &op, word) != EOF) {
switch (op) {
case 0:
add(word); break;
case 1:
del(word); break;
case 2:
printf("%d\n", acc(word)); break;
case 3:
printf("%d\n", len(word)); break;
default: break;
};
}
}