Pagini recente » Cod sursa (job #697800) | Cod sursa (job #2321571) | Cod sursa (job #2422261) | Cod sursa (job #863583) | Cod sursa (job #1438589)
#include <iostream>
#include <cstdio>
#define CH (*cuv - 'a')
#define sigma 26
using namespace std;
struct Trie {
int words;
int prefixes;
Trie *letter[sigma];
Trie() {
words = 0;
prefixes = 0;
for(int i = 0 ; i < sigma; ++i) {
letter[i] = NULL;
}
}
} *root = new Trie();
void addWord(Trie *node, char* cuv) {
if(*cuv == '\n') {
node->words++;
return;
}
node->prefixes++;
if(node->letter[CH] == NULL) {
node->letter[CH] = new Trie;
}
addWord(node->letter[CH], cuv + 1);
}
int countWord(Trie *node, char* cuv) {
if(*cuv == '\n')
return node->words;
if(node->letter[CH] == NULL)
return 0;
return countWord(node->letter[CH], cuv+1);
}
int longestPrefix(Trie *node, char *cuv) {
if(*cuv == '\n')
return 0;
if(node->letter[CH] == NULL || (node->letter[CH]->prefixes == 0 && node->letter[CH]->words == 0))
return 0;
return longestPrefix(node->letter[CH], cuv + 1) + 1;
}
void delWord(Trie *node, char* cuv) {
if(*cuv == '\n') {
node->words--;
return;
}
// No need to check if cuv exists, guranteed by the problem statement
//...
node->prefixes--;
delWord(node->letter[CH], cuv + 1);
}
char line[24];
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
fgets(line, 24, stdin);
while(!feof(stdin)) {
char type = line[0];
switch(type) {
case '0':
addWord(root, line + 2);
break;
case '1':
delWord(root, line + 2);
break;
case '2':
printf("%d\n", countWord(root, line+2));
break;
case '3':
printf("%d\n", longestPrefix(root, line+2));
break;
}
fgets(line, 24, stdin);
}
return 0;
}