Pagini recente » Cod sursa (job #3293194) | Cod sursa (job #2319903) | Cod sursa (job #2660704) | Cod sursa (job #223752) | Cod sursa (job #2572137)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TrieNode
{
int contor = 0;
unordered_map<char, TrieNode*> child;
};
TrieNode* root = new TrieNode;
TrieNode* push_trie(string& word, size_t poz = 0, TrieNode* node = root)
{
if(poz == word.size())
{
node->contor++;
return node;
}
if(node->child.find(word[poz]) == node->child.end())
{
node->child[word[poz]] = new TrieNode;
}
node->child[word[poz]] = push_trie(word, poz + 1, node->child[word[poz]]);
return node;
}
TrieNode* delete_trie(string& word, size_t poz = 0, TrieNode* node = root)
{
if(poz == word.size())
{
node->contor--;
if(node->contor == 0)
{
bool empty_node = true;
for(char c = 'a'; c <= 'z'; ++c)
{
if(node->child.find(word[poz]) != node->child.end())
{
empty_node = false;
break;
}
}
if(empty_node == true) return nullptr;
}
return node;
}
node->child[word[poz]] = delete_trie(word, poz + 1, node->child[word[poz]]);
if(node->child[word[poz]] == nullptr) node->child.erase(word[poz]);
return node;
}
int search_trie(string& word, size_t poz = 0, TrieNode* node = root)
{
if(poz == word.size())
return node->contor;
if(node->child.find(word[poz]) == node->child.end())
return 0;
return search_trie(word, poz + 1, node->child[word[poz]]);
}
int cmlpc_trie(string& word, size_t poz = 0, TrieNode* node = root)
{
if(poz == word.size()) return poz;
if(node->child.find(word[poz]) == node->child.end()) return poz;
return cmlpc_trie(word, poz + 1, node->child[word[poz]]);
}
int main()
{
string word;
int c;
while(fin >> c >> word)
{
if(c == 0)
push_trie(word);
else
if(c == 1)
delete_trie(word);
else
if(c == 2)
fout << search_trie(word) << '\n';
else
fout << cmlpc_trie(word) << '\n';
}
}