Pagini recente » Cod sursa (job #1103822) | Cod sursa (job #541165) | Cod sursa (job #2944506) | Cod sursa (job #2329441) | Cod sursa (job #2656455)
#include <fstream>
#include <cstring>
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;
char word[SIGMA + 1];
void addWord(TrieNode *node, char *word) {
node->wordsContained ++;
if(*word == '\0') {
node->wordsEndHere ++;
return;
}
int nextIndex = *word - 'a';
if(node->next[nextIndex] == nullptr) {
node->next[nextIndex] = new TrieNode;
}
addWord(node->next[nextIndex], word + 1);
}
void deleteWord(TrieNode *node, char *word) {
node->wordsContained --;
if(*word == '\0') {
node->wordsEndHere --;
return;
}
int nextIndex = *word - 'a';
deleteWord(node->next[nextIndex], word + 1);
if(node->next[nextIndex]->wordsContained == 0) {
free(node->next[nextIndex]);
node->next[nextIndex] = nullptr;
}
}
int appeared_trie(TrieNode *node, char *word) {
if(*word == '\0') {
return node->wordsEndHere;
}
int nextIndex = *word - 'a';
if(node->next[nextIndex] == nullptr)
return 0;
return appeared_trie(node->next[nextIndex], word + 1);
}
int longest_common_prefix(TrieNode *node, char *word) {
if(*word == '\0')
return 0;
int nextIndex = *word - 'a';
if(node->next[nextIndex] == nullptr)
return 0;
return 1 + longest_common_prefix(node->next[nextIndex], word + 1);
}
int main() {
int op;
char s[100] = {};
root = new TrieNode;
while(f.getline(s, SIGMA)) {
switch(s[0]) {
case '0' : addWord(root, s + 2); break;
case '1' : deleteWord(root, s + 2); break;
case '2' : g << appeared_trie(root, s + 2) << '\n'; break;
case '3' : g << longest_common_prefix(root, s + 2) << '\n'; break;
}
}
}