Pagini recente » Cod sursa (job #3243126) | Cod sursa (job #279213) | Cod sursa (job #1903770) | Cod sursa (job #99219) | Cod sursa (job #531465)
Cod sursa(job #531465)
#include<cstdio>
#include<cstring>
using namespace std;
struct trie {
int words;
int prefix;
trie *edge[26];
trie() {
words = prefix = 0;
for (int i = 0; i < 26; i++) edge[i] = NULL;
}
};
trie *root = new trie;
void insert(trie *node, char *s) {
int ch = s[0] - 'a';
if (node->edge[ch] == NULL) node->edge[ch] = new trie;
node->edge[ch]->prefix++;
if (strlen(s) == 1) node->edge[ch]->words++;
else if (strlen(s) > 1) insert(node->edge[ch], s+1);
}
void del(trie *node, char *s) {
int ch = s[0] - 'a';
node->edge[ch]->prefix--;
if (strlen(s) == 1) node->edge[ch]->words--;
else if (strlen(s) > 1) del(node->edge[ch], s+1);
}
int words(trie *node, char *s) {
if (!node) return 0;
int ch = s[0] - 'a';
if (strlen(s) == 1) return node->edge[ch]->words;
else if (strlen(s) > 1) words(node->edge[ch], s+1);
}
int prefixes(trie *node, char *s, int depth) {
int ch = s[0] - 'a';
if ((!node->edge[ch])||(node->edge[ch]->prefix == 0)||(strlen(s) == 0)) return depth;
else if (strlen(s) > 0) prefixes(node->edge[ch], s+1, depth + 1);
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int op;
char s[32];
scanf("%d %s", &op, s);
while (!feof(stdin)) {
switch (op) {
case 0: insert(root, s); break;
case 1: del(root, s); break;
case 2: printf("%d\n", words(root,s)); break;
case 3: printf("%d\n", prefixes(root, s, 0)); break;
default: break;
}
scanf("%d %s", &op, s);
}
return 0;
}