Pagini recente » Cod sursa (job #2835928) | Cod sursa (job #485507) | Cod sursa (job #2406206) | Cod sursa (job #2444076) | Cod sursa (job #1567841)
#include <cstdio>
const int Sigma = 26;
class Trie {
public:
int ap;
Trie* fii[Sigma + 3];
int nSons;
Trie() {
for(int i = 0; i <= Sigma; ++ i)
fii[i] = NULL;
ap = nSons = 0;
}
void insert(const char* const word) {
if (!word[0]) {
++ ap;
} else {
int first = word[0] - 'a';
if (fii[first] == NULL)
fii[first] = new Trie();
fii[first]->insert(word + 1);
}
++ nSons;
}
int wordQuery(const char* const word) {
if(!word[0]) {
return ap;
} else {
int first = word[0] - 'a';
if (fii[first] == NULL)
return 0;
else
return fii[first]->wordQuery(word + 1);
}
}
int prefixQuery(const char* const word) {
if(!word[0]) {
return 0;
} else {
int first = word[0] - 'a';
if (fii[first] == NULL)
return 0;
else
return fii[first]->prefixQuery(word + 1) + 1;
}
}
void erase(const char* const word) {
if(!word[0]) {
-- ap;
} else {
int first = word[0] - 'a';
fii[first]->erase(word + 1);
if(!fii[first]->nSons) {
delete fii[first];
fii[first] = NULL;
}
}
-- nSons;
}
};
Trie* lambda = new Trie();
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int op;
char word[32];
while(scanf("%d %s", &op, word) == 2) {
switch(op) {
case 0: lambda->insert(word); break;
case 1: lambda->erase(word); break;
case 2: printf("%d\n", lambda->wordQuery(word)); break;
case 3: printf("%d\n", lambda->prefixQuery(word)); break;
}
}
return 0;
}