Pagini recente » Cod sursa (job #2197670) | Cod sursa (job #380086) | Cod sursa (job #1501762) | Cod sursa (job #1672867) | Cod sursa (job #1184351)
/*
Keep It Simple!
*/
#include<fstream>
#include<cstring>
using namespace std;
struct Trie
{
int NrWords,NrKids;
Trie *Next[28];
Trie()
{
NrWords = NrKids = 0;
memset(Next,0,sizeof(Next));
}
}*T;
void AddToTrie(Trie *node,char *s)
{
if(s[0] == NULL)
{
node->NrWords++;
return;
}
else
{
if(!node->Next[s[0]-'a'])
{
node->Next[s[0]-'a'] = new Trie;
node->NrKids++;
}
AddToTrie(node->Next[s[0]-'a'],s+1);
}
}
void RemoveFromTrie(Trie* node,char *s)
{
if(s[0] == NULL)
{
node->NrWords --;
return;
}
else
{
RemoveFromTrie(node->Next[s[0] - 'a'],s+1);
if(node->Next[s[0] - 'a']->NrKids == 0 && node->Next[s[0] - 'a']->NrWords == 0)
{
node->Next[s[0] - 'a'] = NULL;
node->NrKids--;
}
}
}
int NumberOfWords(Trie *node, char* s)
{
if(node->Next[s[0]-'a'] == NULL) return 0;
if(s[0] == NULL)
return node->NrWords;
return NumberOfWords(node->Next[s[0]-'a'],s+1);
}
int LongestPrefix(Trie* node, char* s, int cnt)
{
if(s[0] == NULL || node->Next[s[0]-'a'] == NULL)
return cnt;
return LongestPrefix(node->Next[s[0]-'a'],s+1,cnt+1);
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
T = new Trie();
int type;
char c[25];
while( f >> type >> c )
{
switch(type)
{
case 0: AddToTrie(T,c); break;
case 1: RemoveFromTrie(T,c); break;
case 2: g << NumberOfWords(T,c) << "\n"; break;
case 3: g << LongestPrefix(T,c,0) << "\n"; break;
}
}
f.close();
g.close();
return 0;
}