Pagini recente » Cod sursa (job #2601745) | Cod sursa (job #1678468) | Cod sursa (job #2684650) | Cod sursa (job #1877984) | Cod sursa (job #2987712)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
const int LETTERS_IN_ALPHABET = 26;
struct TrieNode
{
int cnt = 0, endOfWord = 0;
TrieNode *children[LETTERS_IN_ALPHABET] = { NULL };
};
void Push(TrieNode *&root, string s)
{
TrieNode *curr = root;
int len = s.length();
for (int i = 0; i < len; i++)
{
int index = s[i] - 'a';
if (curr -> children[index] == NULL)
{
curr -> children[index] = new TrieNode;
}
curr = curr -> children[index];
curr -> cnt++;
}
curr -> endOfWord++;
}
void Pop(TrieNode *&root, string s)
{
TrieNode *curr = root;
int len = s.length();
for (int i = 0; i < len; i++)
{
int index = s[i] - 'a';
if (curr -> children[index] == NULL)
{
return;
}
curr = curr -> children[index];
curr -> cnt--;
}
if (curr -> endOfWord > 0)
{
curr -> endOfWord--;
}
}
int Frequency(TrieNode *root, string s)
{
TrieNode *curr = root;
int len = s.length();
for (int i = 0; i < len; i++)
{
int index = s[i] - 'a';
if (curr -> children[index] == NULL)
{
return 0;
}
curr = curr -> children[index];
}
return curr -> endOfWord;
}
int LongestPrefix(TrieNode *root, string s)
{
TrieNode *curr = root;
int len = s.length();
int maximum = 0, temp = 0;
for (int i = 0; i < len; i++)
{
int index = s[i] - 'a';
if (curr -> children[index] == NULL)
{
return maximum;
}
curr = curr -> children[index];
temp++;
if (curr -> cnt > 0)
{
maximum = temp;
}
}
return maximum;
}
int main()
{
TrieNode *root = new TrieNode;
int option; string s;
while (f >> option >> s)
{
switch (option)
{
case 0:
Push(root, s);
break;
case 1:
Pop(root, s);
break;
case 2:
g << Frequency(root, s) << "\n";
break;
case 3:
g << LongestPrefix(root, s) << "\n";
break;
}
}
}