Pagini recente » Cod sursa (job #2317648) | Cod sursa (job #463329) | Cod sursa (job #2938233) | Cod sursa (job #1256938) | Cod sursa (job #1838294)
#include <fstream>
#include <string.h>
#define NMax 21
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct TrieNode {
TrieNode* edges[26];
int count;
int children;
TrieNode() {
count = 0;
children = 0;
memset(edges, 0, sizeof edges);
}
};
TrieNode* root;
char tmp[NMax];
int cmd;
TrieNode* create_new_node()
{
TrieNode* newNode = new TrieNode;
return newNode;
}
void insert_new_word(char (&newWord)[NMax])
{
TrieNode* crtNode = root;
int newWordLen = strlen(newWord);
for (int i = 0; i < newWordLen; i++) {
if (crtNode->edges[newWord[i] - 'a'] == nullptr) {
crtNode->edges[newWord[i] - 'a'] = create_new_node();
crtNode->children++;
}
crtNode = crtNode->edges[newWord[i] - 'a'];
}
crtNode->count++;
}
bool delete_word(TrieNode* crtNode, char (&word)[NMax], int pos, int len)
{
if (pos == len)
crtNode->count--;
else if (delete_word(crtNode->edges[word[pos] - 'a'], word, pos + 1, len)) {
crtNode->edges[word[pos] - 'a'] = nullptr;
crtNode->children--;
}
if (crtNode->count == 0 && crtNode->children == 0 && crtNode != root) {
delete crtNode;
return true;
}
else
return false;
}
int number_of_occurences(char(&word)[NMax])
{
TrieNode* crtNode = root;
int newWordLen = strlen(word);
for (int i = 0; i < newWordLen; i++) {
if (crtNode == nullptr)
return 0;
crtNode = crtNode->edges[word[i] - 'a'];
}
return crtNode->count;
}
int longest_prefix(char(&word)[NMax])
{
TrieNode* crtNode = root;
int newWordLen = strlen(word);
int cnt = 0;
for (int i = 0; i < newWordLen; i++, cnt++) {
if (crtNode->edges[word[i] - 'a'] != nullptr)
crtNode = crtNode->edges[word[i] - 'a'];
else
break;
}
return cnt;
}
int main()
{
root = create_new_node();
while (f >> cmd) {
f >> tmp;
switch (cmd)
{
case 0:
insert_new_word(tmp);
break;
case 1:
delete_word(root, tmp, 0, strlen(tmp));
break;
case 2:
g << number_of_occurences(tmp) << "\n";
break;
case 3:
g << longest_prefix(tmp) << "\n";
break;
}
}
}