Pagini recente » Cod sursa (job #719774) | Cod sursa (job #1053812) | Cod sursa (job #830899) | Cod sursa (job #251926) | Cod sursa (job #2635901)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trieNode
{
int nr, nrChildren;
trieNode *children[26], *parent;
};
trieNode *getNode(trieNode *p)
{
trieNode *aux = new trieNode;
aux -> nr = 0;
aux -> nrChildren = 0;
aux -> parent = p;
memset(aux -> children, NULL, sizeof(aux -> children));
return aux;
}
trieNode *root = getNode(NULL);
void Insert(trieNode *root, string key)
{
trieNode *aux = root;
for (int i=0; i<key.size(); i++)
{
int index = key[i] - 'a';
if (!aux -> children[index])
{
aux -> children[index] = getNode(aux);
aux -> nrChildren ++;
}
aux = aux -> children[index];
}
aux -> nr ++;
}
trieNode *Delete(trieNode *node, string key, int depth)
{
if (!node)
return NULL;
if (depth == key.size())
{
node -> nr --;
if (!node -> nr && !node -> nrChildren && node != root)
{
if (node -> parent)
node -> parent -> nrChildren --;
delete(node);
node = NULL;
}
return node;
}
int index = key[depth] - 'a';
node -> children[index] = Delete(node -> children[index], key, depth + 1);
if (!node -> nrChildren && !node -> nr && node != root)
{
if (node -> parent)
node -> parent -> nrChildren --;
delete(node);
node = NULL;
}
return node;
}
int nrAp(trieNode *root, string key)
{
trieNode *aux = root;
for (int i=0; i<key.size(); i++)
{
int index = key[i] - 'a';
if (aux -> children[index])
aux = aux -> children[index];
else
return 0;
}
return aux -> nr;
}
int maxPrefix(trieNode *root, string key)
{
trieNode *aux = root;
for (int i=0; i<key.size(); i++)
{
int index = key[i] - 'a';
if (aux -> children[index])
aux = aux -> children[index];
else
return i;
}
return key.size();
}
int main()
{
char c[23];
while (f.getline(c, 23))
{
if (c[0] == '0')
Insert(root, c + 2);
else if (c[0] == '1')
trieNode *aux = Delete(root, c + 2, 0);
else if (c[0] == '2')
g << nrAp(root, c + 2) << "\n";
else if (c[0] == '3')
g << maxPrefix(root, c + 2) << "\n";
}
return 0;
}