Pagini recente » Cod sursa (job #2171282) | Cod sursa (job #1249935) | Cod sursa (job #624145) | Cod sursa (job #1213056) | Cod sursa (job #1150460)
/*
Keep It Simple!
*/
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include<fstream>
using namespace std;
int type;
char c[22];
struct T
{
int NrWords,NrSons;
T* next[27];
T()
{
NrWords = NrSons = 0;
for (int i = 0; i < 27; i++) next[i] = 0;
};
}*Trie;
void AddToTrie(T* node, char *str)
{
int p = str[0] - 'a';
if (str[0] == 0)
{
node->NrWords++;
return;
}
else
{
if (!node->next[p])
{
node->NrSons++;
node->next[p] = new T();
}
AddToTrie(node->next[p],str + 1);
}
}
int FindWordsAppNumber(T* node, char *str)
{
int p = str[0] - 'a';
if (str[0] == 0)
return node->NrWords;
else
{
if (!node->next[p])
return 0;
return FindWordsAppNumber(node->next[p], str + 1);
}
}
void RemoveFromTrie(T* node, char* str)
{
int p = str[0] - 'a';
if (str[0] == 0)
{
node->NrWords--;
return;
}
if (node->next[p]) RemoveFromTrie(node->next[p], str + 1);
if (node->next[p]->NrWords < 1 && node->next[p]->NrSons == 0)
delete node->next[p];
}
int NumberOfPrefixes(T* node, char * str, int level)
{
int p = str[0] - 'a';
if (str[0] == 0)
return level;
else
{
if (!node->next[p])
return level;
return NumberOfPrefixes(node->next[p], str + 1, level + 1);
}
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
Trie = new T();
while (f >> type >> c)
{
if (type == 0)
AddToTrie(Trie, c);
else if (type == 2)
g << FindWordsAppNumber(Trie, c) << "\n";
else if (type == 1)
RemoveFromTrie(Trie, c);
else if (type == 3)
g << NumberOfPrefixes(Trie, c, 0) << "\n";
}
}