Pagini recente » Cod sursa (job #2192383) | Cod sursa (job #2946319) | Cod sursa (job #306902) | Cod sursa (job #1861761) | Cod sursa (job #2381082)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
class TrieNode;
class unordered_map
{
private:
vector<TrieNode*> container;
public:
unordered_map()
{
container.resize('z' - 'a' + 5);
}
TrieNode* &operator [](char c)
{
return container[c - 'a'];
}
bool find(char c)
{
return container[c - 'a'] != nullptr;
}
void erase(char c)
{
container[c - 'a'] = nullptr;
}
bool empty()
{
return count_if(container.begin(), container.end(), [](TrieNode* x) { return x != nullptr; }) == 0;
}
};
class TrieNode
{
unordered_map children;
int cnt = 0;
public:
void insert(string s, int index = 0)
{
if (index == s.size())
{
++cnt;
return;
}
if (!children.find(s[index]))
children[s[index]] = new TrieNode();
children[s[index]]->insert(s, index + 1);
}
bool remove(string s, int index = 0)
{
if (index == s.size())
{
--cnt;
return cnt <= 0 && children.empty();
}
if (children.find(s[index]))
{
bool removeNext = children[s[index]]->remove(s, index + 1);
if (removeNext)
children.erase(s[index]);
return cnt <= 0 && children.empty();
}
}
int count(string s, int index = 0)
{
if (index == s.size())
return cnt;
if (children.find(s[index]))
return children[s[index]]->count(s, index + 1);
else
return 0;
}
int prefix(string s, int index = 0)
{
if (index == s.size())
return s.size();
if (children.find(s[index]))
return children[s[index]]->prefix(s, index + 1);
else
return index;
}
};
int main()
{
int op;
string s;
TrieNode trie;
while(!f.eof() && f >> op >> s)
switch (op)
{
case 0:
trie.insert(s);
break;
case 1:
trie.remove(s);
break;
case 2:
g << trie.count(s) << '\n';
break;
case 3:
g << trie.prefix(s) << '\n';
break;
}
return 0;
}