Pagini recente » Cod sursa (job #2844837) | Cod sursa (job #2281158) | Cod sursa (job #2281113) | Cod sursa (job #2604659) | Cod sursa (job #2572148)
#include <bits/stdc++.h>
using namespace std;
struct TrieNode
{
int counter = 0;
unordered_map<char, TrieNode*> child;
} *trieRoot{new TrieNode};
void trie_push(char* word)
{
TrieNode* node = trieRoot;
for(int i = 0; word[i] != '\0'; ++i)
{
if(node->child.find(word[i]) == node->child.end())
node->child[word[i]] = new TrieNode;
node = node->child[word[i]];
}
node->counter++;
}
TrieNode* trie_delete(char* word, TrieNode* node = trieRoot)
{
char character = word[0];
if(character == '\0')
{
node->counter--;
return node;
}
TrieNode* child = node->child[character];
child = trie_delete(word + 1, child);
if(child->counter == 0 && child->child.empty() == true)
node->child.erase(character);
return node;
}
int trie_count(char* word)
{
TrieNode* node = trieRoot;
for(int i = 0; word[i] != '\0'; ++i)
{
if(node->child.find(word[i]) == node->child.end())
return 0;
node = node->child[word[i]];
}
return node->counter;
}
int trie_longest_prefix(char* word)
{
TrieNode* node = trieRoot;
int length = 0;
for(int i = 0; word[i] != '\0'; ++i)
{
if(node->child.find(word[i]) == node->child.end())
break;
node = node->child[word[i]];
length++;
}
return length;
}
int main()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
int queryType;
char* word = new char[21];
while(fin >> queryType >> word)
{
if(queryType == 0)
trie_push(word);
if(queryType == 1)
trie_delete(word);
if(queryType == 2)
fout << trie_count(word) << '\n';
if(queryType == 3)
fout << trie_longest_prefix(word) << '\n';
}
}