Pagini recente » Cod sursa (job #448805) | Cod sursa (job #2990878) | Cod sursa (job #746008) | Cod sursa (job #745762) | Cod sursa (job #1049794)
#include <iostream>
#include <fstream>
using namespace std;
class TrieNode {
public:
int wordNum, childrenNum;
TrieNode* children[26];
TrieNode() {
wordNum = 0;
childrenNum = 0;
for (int i = 0; i < 26; i++) {
children[i] = NULL;
}
}
};
class Trie {
TrieNode* root;
void addWord(TrieNode* node, const string& word, int pos) {
if (pos == word.size()) {
node->wordNum++;
} else {
int child = word[pos]-'a';
if (node->children[child] == NULL) {
node->children[child] = new TrieNode();
node->childrenNum++;
}
addWord(node->children[child], word, pos+1);
}
}
bool deleteWord(TrieNode* node, const string& word, int pos) {
if (pos == word.size()) {
if (node->wordNum > 0) {
node->wordNum--;
}
} else {
int child = word[pos]-'a';
if (node->children[child] != NULL) {
if (deleteWord(node->children[child], word, pos+1)) {
node->children[child] = NULL;
node->childrenNum--;
}
}
}
if (node->wordNum == 0 && node->childrenNum == 0 && node != root) {
delete node;
return true;
} else {
return false;
}
}
int count(TrieNode* node, const string& word, int pos) {
if (pos == word.size()) {
return node->wordNum;
} else {
int child = word[pos]-'a';
if (node->children[child] == NULL) {
return 0;
} else {
return count(node->children[child], word, pos+1);
}
}
}
int longestPrefix(TrieNode* node, const string& word, int pos) {
if (pos == word.size()) {
return pos;
} else {
int child = word[pos]-'a';
if (node->children[child] == NULL) {
return pos;
} else {
return longestPrefix(node->children[child], word, pos+1);
}
}
}
public:
Trie() {
root = new TrieNode();
}
void addWord(const string& word) {
addWord(root, word, 0);
}
bool deleteWord(const string& word) {
deleteWord(root, word, 0);
}
int count(const string& word) {
count(root, word, 0);
}
int longestPrefix(const string& word) {
longestPrefix(root, word, 0);
}
};
int main() {
ifstream f("trie.in");
ofstream g("trie.out");
Trie trie;
while (true) {
int operationType;
f >> operationType;
if (f.eof()) {
break;
}
f.get();
string word;
getline(f, word);
if (operationType == 0) {
trie.addWord(word);
} else if (operationType == 1) {
trie.deleteWord(word);
} else if (operationType == 2) {
g << trie.count(word) << '\n';
} else {
g << trie.longestPrefix(word) << '\n';
}
}
return 0;
}