Pagini recente » Cod sursa (job #2568124) | Cod sursa (job #1644977) | Cod sursa (job #1630673) | Cod sursa (job #134536) | Cod sursa (job #2038732)
#include <fstream>
#include <string>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define MAX ('z' - 'a' + 1)
struct Node
{
Node* children[MAX];
int count;
int count_children;
Node()
{
count = 0;
count_children = 0;
for (int i = 0; i < MAX; i++)
{
children[i] = nullptr;
}
}
};
Node *root = new Node;
void InsertWord(string word)
{
Node *p = root;
for (auto it = word.begin(); it != word.end(); it++)
{
int index = *it - 'a';
if (p->children[index] == nullptr)
{
p->children[index] = new Node();
p->count_children++;
}
p = p->children[index];
}
p->count++;
}
void DeleteWord(string word, int i = 0, Node* &p = root)
{
if (i == word.size())
{
p->count--;
}
else
{
int index = word[i] - 'a';
DeleteWord(word, i + 1, p->children[index]);
if (p->children[index] == nullptr) p->count_children--;
}
if (p != root && p->count == 0 && p->count_children == 0)
{
delete p;
p = nullptr;
}
}
int CountWord(string word)
{
Node *p = root;
for (auto it = word.begin(); it != word.end(); it++)
{
int index = *it - 'a';
if (p->children[index] == nullptr)
return 0;
p = p->children[index];
}
return p->count;
}
int LongestPrefix(string word)
{
Node *p = root;
auto it = word.begin();
for (; it != word.end() && p->children[*it - 'a']; it++)
{
p = p->children[*it - 'a'];
}
int longest = it - word.begin();
return longest;
}
int main()
{
int opt;
string word;
int count_mod = 0;
while (in >> opt >> word)
{
switch (opt)
{
case 0:
InsertWord(word);
break;
case 1:
DeleteWord(word);
break;
case 2:
out << CountWord(word) << '\n';
break;
case 3:
out << LongestPrefix(word) << '\n';
break;
}
}
}