Pagini recente » Cod sursa (job #2984373) | Cod sursa (job #2329371) | Clasamentul arhivei Infoarena Monthly | Cod sursa (job #2889572) | Cod sursa (job #2668140)
#include <bits/stdc++.h>
using namespace std;
class Node {
public:
Node *childs[int('z' - 'a' + 1)];
int wcnt;//word
int pcnt;//pref
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->pcnt++;
word++;
}
node->wcnt++;
}
void del(const char * word) {
Node* node = root;
while (*word) {
node = node->childs[(*word) - 'a'];
word++;
node->pcnt--;
}
node->wcnt--;
}
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->wcnt;
}
int len(const char * word) {
Node* node = root;
int cnt = 0;
while (*word) {
if (node->childs[(*word) - 'a']) {
node = node->childs[(*word) - 'a'];
if (!(node->pcnt)) break;
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;
};
}
}