Pagini recente » Cod sursa (job #2833313) | Cod sursa (job #3307194) | Cod sursa (job #2328302) | Cod sursa (job #2113698) | Cod sursa (job #3321546)
#include <iostream>
#include <fstream>
#include <cstring>
// #include <memory>
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
const int alphabet_size = 30;
class node{
public:
node *next[alphabet_size];
int ct,end;
node() : ct(0), end(0)
{
for(int i = 0; i < alphabet_size; ++i)
next[i] = NULL;
}
};
void add(node *trie_node, std::string s, int pos)
{
trie_node->ct++;
if(s.size() == pos)
{
trie_node->end++;
return;
}
int letter = s[pos] - 'a';
if(trie_node->next[letter] == NULL)
{
node *new_node = new node;
trie_node->next[letter] = new_node;
}
add(trie_node->next[letter], s, pos + 1);
}
void del(node *trie_node, std::string s, int pos)
{
trie_node->ct--;
if(s.size() == pos)
{
trie_node->end--;
return;
}
int letter = s[pos] - 'a';
del(trie_node->next[letter], s, pos + 1);
if(trie_node->next[letter]->ct == 0)
{
delete trie_node->next[letter];
trie_node->next[letter] = NULL;
}
}
int count(node *trie_node, std::string s, int pos)
{
if(trie_node == NULL)
return 0;
if(s.size() == pos)
return trie_node->end;
int letter = s[pos] - 'a';
return count(trie_node->next[letter], s, pos + 1);
}
int pref(node *trie_node, std::string s, int pos)
{
if(trie_node == NULL)
return 0;
if(s.size() == pos)
return 0;
int letter = s[pos] - 'a';
return (trie_node->next[letter] != NULL) + pref(trie_node->next[letter], s, pos + 1);
}
int main()
{
node *start_trie = new node;
int op;
std::string s;
while(fin >> op >> s)
{
op++;
if(op == 1)
add(start_trie, s, 0);
else if(op == 2)
del(start_trie, s, 0);
else if(op == 3)
fout << count(start_trie, s, 0) << "\n";
else
fout << pref(start_trie, s, 0) << "\n";
}
fin.close();
fout.close();
return 0;
return 0;
}