Pagini recente » Cod sursa (job #3159194) | Borderou de evaluare (job #1796677) | Borderou de evaluare (job #2683558) | Cod sursa (job #1543801) | Cod sursa (job #3233309)
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
#include <string>
#include <sstream>
using namespace std;
struct TrieNode {
unordered_map<char, TrieNode*> children;
int count; // to store the number of times the word ends here
TrieNode() : count(0) {}
};
class Trie {
public:
Trie() {
root = new TrieNode();
}
void addWord(const string& word) {
TrieNode* node = root;
for (char ch : word) {
if (node->children.find(ch) == node->children.end()) {
node->children[ch] = new TrieNode();
}
node = node->children[ch];
}
node->count++;
}
void removeWord(const string& word) {
if (searchWord(word) > 0) {
TrieNode* node = root;
for (char ch : word) {
if (node->children.find(ch) == node->children.end()) {
return;
}
node = node->children[ch];
}
node->count--;
}
}
int searchWord(const string& word) {
TrieNode* node = root;
for (char ch : word) {
if (node->children.find(ch) == node->children.end()) {
return 0;
}
node = node->children[ch];
}
return node->count;
}
int longestPrefix(const string& word) {
TrieNode* node = root;
int length = 0;
for (char ch : word) {
if (node->children.find(ch) == node->children.end()) {
break;
}
node = node->children[ch];
length++;
}
return length;
}
private:
TrieNode* root;
};
int main() {
ifstream infile("trie.in");
ofstream outfile("trie.out");
Trie trie;
string line;
while (getline(infile, line)) {
char op;
string word;
istringstream iss(line);
iss >> op >> word;
if (op == '0') {
trie.addWord(word);
} else if (op == '1') {
trie.removeWord(word);
} else if (op == '2') {
outfile << trie.searchWord(word) << endl;
} else if (op == '3') {
outfile << trie.longestPrefix(word) << endl;
}
}
infile.close();
outfile.close();
return 0;
}