Pagini recente » Cod sursa (job #74694) | Cod sursa (job #3127877) | Cod sursa (job #2683401) | Cod sursa (job #2930368) | Cod sursa (job #2137815)
#include <bits/stdc++.h>
#define LMAX 26
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TrieNode {
/* number of words that pass through this node */
int wordCount;
TrieNode* child[LMAX];
TrieNode(int val) {
wordCount = val;
for (int i = 0; i < LMAX; ++i) {
child[i] = nullptr;
}
}
};
TrieNode* root = new TrieNode(0);
void insertWord(TrieNode *node, const char* word) {
if (word[0] != NULL) {
if (node->child[word[0] - 'a'] == nullptr) {
node->child[word[0] - 'a'] = new TrieNode(1);
} else {
node->child[word[0] - 'a']->wordCount++;
}
insertWord(node->child[word[0] - 'a'], word + 1);
}
}
bool eraseWord(TrieNode* node, const char* word) {
if (word[0] != NULL) {
eraseWord(node->child[word[0] - 'a'], word + 1);
if (node->child[word[0] - 'a']->wordCount == 1) {
delete node->child[word[0] - 'a'];
node->child[word[0] - 'a'] = nullptr;
} else {
node->child[word[0] - 'a']->wordCount--;
}
}
}
int wordCnt(TrieNode* node, const char* word) {
if (node->child[word[0] - 'a'] == nullptr) {
return 0;
}
if (word[1] == NULL) {
int sum = 0;
/* count the words that pass through the current node and are larger that "word" */
for (int i = 0; i < LMAX; ++i) {
if (node->child[word[0] - 'a']->child[i]) {
sum += node->child[word[0] - 'a']->child[i]->wordCount;
}
}
return node->child[word[0] - 'a']->wordCount - sum;
}
return wordCnt(node->child[word[0] - 'a'], word + 1);
}
int findPrefix(TrieNode* node, const char* word) {
if (word[0] == NULL) {
return 0;
}
if (node->child[word[0] - 'a'] == nullptr) {
return 0;
}
return 1 + findPrefix(node->child[word[0] - 'a'], word + 1);
}
int main() {
int type;
char word[21];
while (fin >> type >> word) {
if (type == 0) {
insertWord(root, word);
} else if (type == 1) {
eraseWord(root, word);
} else if (type == 2) {
fout << wordCnt(root, word) << '\n';
} else if (type == 3) {
fout << findPrefix(root, word) << '\n';
}
}
return 0;
}