Pagini recente » Cod sursa (job #1140332) | Cod sursa (job #2599395) | Cod sursa (job #1065060) | Cod sursa (job #86405) | Cod sursa (job #2449233)
#include <fstream>
#include <cstring>
#include <cassert>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
const int SIGMA = 26;
struct Trie
{
int freq;
int leaf;
Trie *neigh[SIGMA];
Trie()
{
this->freq = 0;
this->leaf = 0;
memset(this->neigh, NULL, sizeof(this->neigh));
}
};
Trie *Root = new Trie();
namespace operations {
void insert(Trie *&node, string &seq, int ind)
{
node -> freq += 1;
if (ind == seq.size())
{
node -> leaf += 1;
return;
}
else
{
int where_to_go = seq[ind] - 'a';
if (node -> neigh[where_to_go] == nullptr)
node -> neigh[where_to_go] = new Trie();
insert(node -> neigh[where_to_go], seq, ind + 1);
}
}
void remove(Trie *&node, string &seq, int ind)
{
node-> freq -= 1;
if (ind == seq.size())
{
node -> leaf -= 1;
}
else
{
int where_to_go = seq[ind] - 'a';
remove(node->neigh[where_to_go], seq, ind + 1);
}
if (node != Root and node -> freq == 0)
delete node, node = nullptr;
}
int get_frequency_for_word(Trie *&node, string &seq, int ind)
{
if (ind == seq.size())
return node -> leaf;
int where_to_go = seq[ind] - 'a';
if (node->neigh[where_to_go] != nullptr)
return get_frequency_for_word(node->neigh[where_to_go], seq, ind + 1);
return 0;
}
int get_longest_common_prefix(Trie *&node, string &seq, int ind)
{
if (node -> freq > 0)
{
int where_to_go = seq[ind] - 'a';
if (node -> neigh[where_to_go] != nullptr)
return get_longest_common_prefix(node -> neigh[where_to_go], seq, ind + 1);
}
return ind;
}
}
int main() {
int type;
string s;
while (cin >> type >> s)
{
if (type == 0)
{
operations::insert(Root, s, 0);
}
else if (type == 1)
{
operations::remove(Root, s, 0);
}
else if (type == 2)
{
cout << operations::get_frequency_for_word(Root, s, 0) << '\n';
}
else
{
assert(type == 3);
cout << operations::get_longest_common_prefix(Root, s, 0) << '\n';
}
}
return 0;
}