Pagini recente » Cod sursa (job #2917210) | Cod sursa (job #3249801) | Cod sursa (job #1080327) | Cod sursa (job #2644253) | Cod sursa (job #2682496)
#include <cstring>
#include <fstream>
using namespace std;
// Questions:
// (*currentNode).count <=> currentNode->count
const int ALPHA = 26;
struct TrieNode {
int count;
int leaf;
TrieNode *next[ALPHA];
TrieNode() : count(0), leaf(0) {
memset(next, 0, sizeof(next));
}
};
void insert(TrieNode *& currentNode, int currentIndex, const string& currentSeq) {
currentNode -> count += 1;
if (currentIndex == currentSeq.size()) {
currentNode -> leaf += 1;
return;
}
auto nextChar = currentSeq[currentIndex] - 'a';
if (currentNode->next[nextChar] == nullptr) {
currentNode->next[nextChar] = new TrieNode();
}
insert(currentNode->next[nextChar], currentIndex + 1, currentSeq);
}
void erase(TrieNode*& currentNode, int currentIndex, const string& currentSeq) {
currentNode -> count -= 1;
if (currentIndex == currentSeq.size()) {
currentNode -> leaf -= 1;
return;
}
auto nextChar = currentSeq[currentIndex] - 'a';
erase(currentNode->next[nextChar], currentIndex + 1, currentSeq);
if (currentNode->next[nextChar] -> count == 0) {
delete currentNode->next[nextChar];
currentNode->next[nextChar] = nullptr;
}
}
int count(const TrieNode *currentNode, int currentIndex, const string& currentSeq) {
if (currentIndex == currentSeq.size()) {
return currentNode->leaf;
}
auto nextChar = currentSeq[currentIndex] - 'a';
if (currentNode->next[nextChar])
return count(currentNode->next[nextChar], currentIndex + 1, currentSeq);
return 0;
}
int lcp(const TrieNode *currentNode, int currentIndex, const string& currentSeq) {
if (currentNode == nullptr or currentIndex == currentSeq.size()) {
return currentIndex - (currentNode == nullptr);
}
auto nextChar = currentSeq[currentIndex] - 'a';
return lcp(currentNode->next[nextChar], currentIndex + 1, currentSeq);
}
int main() {
ifstream cin ("trie.in");
ofstream cout ("trie.out");
int type;
string word;
auto* Root = new TrieNode();
while (cin >> type >> word) {
switch (type) {
case 0:
insert(Root, 0, word);
break;
case 1:
erase(Root, 0, word);
break;
case 2:
cout << count(Root, 0, word) << '\n';
break;
default:
cout << lcp(Root, 0, word) << '\n';
}
}
return 0;
}