Pagini recente » Cod sursa (job #424048) | Cod sursa (job #1525435) | Cod sursa (job #1138093) | Cod sursa (job #1967839) | Cod sursa (job #2269701)
#include <iostream>
#include <fstream>
#define ALPHABET 27
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct Trie{
int words = 0;
int prefixes = 0;
Trie *edges[ALPHABET] = {0};
};
void AddWord(Trie * t, char * c)
{
if(*c == '\0')
t->words++;
else
{
if(t->edges[*c - 'a'] == NULL)
{
t->edges[*c - 'a'] = new Trie;
t->prefixes++;
}
AddWord(t->edges[*c - 'a'], c+1);
}
}
void DeleteWord(Trie * t, char * c)
{
if(*c == '\0')
t->words--;
else
{
DeleteWord(t->edges[*c - 'a'], c+1);
if(t->edges[*c - 'a']->words == 0 && t->edges[*c - 'a']->prefixes == 0)
{
delete t->edges[*c - 'a'];
t->prefixes--;
t->edges[*c - 'a'] = NULL;
}
}
}
int FindWord(Trie * t, char * c)
{
if(*c == '\0')
return t->words;
if(t->edges[*c - 'a'] == NULL)
return 0;
return FindWord(t->edges[*c - 'a'], c+1);
}
int FindPrefixes(Trie * t, char * c)
{
if(*c == '\0') return 0;
if(t->edges[*c - 'a'] == NULL) return 0;
return 1 + FindPrefixes(t->edges[*c - 'a'], c+1);
}
int main()
{
Trie * trie = new Trie;
char c[100];
int op;
while(fi >> op)
{
fi>>c;
switch(op)
{
case 0: AddWord(trie, c); break;
case 1: DeleteWord(trie, c); break;
case 2: fo<<FindWord(trie, c)<<'\n'; break;
case 3: fo<<FindPrefixes(trie, c)<<'\n'; break;
}
}
fi.close();
fo.close();
}