Pagini recente » Cod sursa (job #2550761) | Cod sursa (job #2216590) | Cod sursa (job #1357913) | Cod sursa (job #1656459) | Cod sursa (job #2655895)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
const int SIGMA = 26;
struct TrieNode {
TrieNode* next[SIGMA] = {};
int wordsEndHere = 0;
int wordsContained = 0;
};
TrieNode *root;
void addWord(TrieNode *node, string word) {
node->wordsContained ++;
if(word.size() == 0) {
node->wordsEndHere ++;
return;
}
int nextIndex = word[0] - 'a';
if(node->next[nextIndex] == nullptr) {
node->next[nextIndex] = new TrieNode;
}
addWord(node->next[nextIndex], word.substr(1));
}
void deleteWord(TrieNode *node, string word) {
node->wordsContained --;
if(word.size() == 0) {
node->wordsEndHere --;
return;
}
int nextIndex = word[0] - 'a';
deleteWord(node->next[nextIndex], word.substr(1));
if(node->next[nextIndex]->wordsContained == 0) {
free(node->next[nextIndex]);
node->next[nextIndex] = nullptr;
}
}
int appeared_trie(TrieNode *node, string word) {
if(word.size() == 0) {
return node->wordsEndHere;
}
int nextIndex = word[0] - 'a';
if(node->next[nextIndex] == nullptr)
return 0;
return appeared_trie(node->next[nextIndex], word.substr(1));
}
int longest_common_prefix(TrieNode *node, string word) {
if(word.size() == 0)
return 0;
int nextIndex = word[0] - 'a';
if(node->next[nextIndex] == nullptr)
return 0;
return 1 + longest_common_prefix(node->next[nextIndex], word.substr(1));
}
int main() {
int op;
string s;
root = new TrieNode;
while(f >> op >> s) {
switch(op) {
case 0 : addWord(root, s); break;
case 1 : deleteWord(root, s); break;
case 2 : g << appeared_trie(root, s) << '\n'; break;
case 3 : g << longest_common_prefix(root, s) << '\n'; break;
}
}
}